问题描述

有一个神奇的口袋,总的容积是40,用这个口袋可以变出
一些物品,这些物品的总体积必须是40。  John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品
的体积分别是a1,a2……an。John可以从这些物品中选择一
些,如果选出的物体的总体积是40,那么利用这个神奇的
口袋,John就可以得到这些物品。现在的问题是,John有
多少种不同的选择物品的方式。
输入
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的
数目。接下来的n行,每行有一个1到40之间的正整数,分别
给出a1,a2……an的值。

输出

输出不同的选择物品的方式的数目

输入样例

3
20
20
20

输出样例

3

枚举的解法:

枚举每个物品是选还是不选,共2
20种情况

显然是不可以的。
递归解法


#include <iostream>
using namespace std;
int a[30]; int N;
int Ways(int w ,int k ) { // 从前k种物品中选择一些,凑成体积w的做法
数目
if( w == 0 ) return 1;
if( k <= 0 ) return 0;
return Ways(w, k -1 ) + Ways(w - a[k], k -1 );
}
int main() {cin >> N;
for( int i = 1;i <= N; ++ i )
cin >> a[i];
cout << Ways(40,N);
return 0;
}

动规解法


#include <iostream>
using namespace std;
int a[30]; int N;
int Ways[50][40];//Ways[i][j]表示从前j种物品里凑出体积i的方法数
int main() {cin >> N;
memset(Ways,0,sizeof(Ways));
for( int i = 1;i <= N; ++ i ) {cin >> a[i]; Ways[0][i] = 1;
}
Ways[0][0] = 1;
for( int w = 1 ; w <= 40; ++ w ) {for( int k = 1; k <= N; ++ k ) {Ways[w][k] = Ways[w][k-1];
if( w-a[k] >= 0)
Ways[w][k] += Ways[w-a[k]][k-1];
}
}
cout << Ways[40][N];
return 0;
} 

神奇的口袋(动态规划)--算法学习相关推荐

  1. 神奇的兔子数列——算法学习笔记

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  2. 动态规划算法学习(一)爬楼梯和凑金额

    爬楼梯 每步可跨台阶:1,2,3 -该场景表示有序组合 台阶总数:15 求多少种跨法 ''' 倒推下,当我倒数第二步已经走了14.13或12步时,我最后一步就可以就可以走完15个台阶此时我15步的走法 ...

  3. 动态规划算法学习二:最长公共子序列

    文章目录 前言 一.问题描述 二.DP实现 1.最优子结构性质***** 2.状态表示***** 3.状态递归方程***** 4.计算最优值***** 5.代码实现:输出最长公共子序列 6.代码实现: ...

  4. 滑雪(动态规划)--算法学习

    问题描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激. 可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底, 你不得不再次走上坡或者等待升降机来载你. Michael想知道载一个区 ...

  5. 北大培训课动态规划----神奇的口袋(百练2755)

    北京大学暑期课<ACM/ICPC竞赛训练> ppt摘取 什么是动态规划? ●递归到动规的一般转化方法  递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数组 ...

  6. php算法学习,php算法学习之动态规划

    动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来. 对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是: 动态规划思想中融 ...

  7. 图解算法学习笔记(九):动态规划

    目录 (1)背包问题 (2)最长公共子串 (3)小结 本章内容: 学习动态规划,它将问题分成小问题,并先着手解决这些小问题. 学习如何设计问题的动态规划解决方案. (1)背包问题 我们再看第八章的背包 ...

  8. 动态规划算法实验报告_强化学习之动态规划算法

    如今的强化学习研究大体分为了两个研究学派:一个是以Sutton,Sliver等人为代表的value-based学派,他们主要从值函数近似角度入手去研究强化学习,这也是强化学习早期最初发展起来时沿用的路 ...

  9. 动态规划之神奇的口袋问题

    问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1,a2,- ...

最新文章

  1. ikvm Java中异常_使用IKVMC将Java转换为.NET库 – 警告IKVMC0108:...
  2. Vue 路由 过渡动效 数据获取
  3. elixir官方入门教程 模式匹配
  4. 面向特定专业领域的计算机,大学计算机文化基础考试题(本科)基础知识部分
  5. 疯狂ios讲义之网页控件(UIWebView)
  6. QT的QDBusArgument类的使用
  7. 在HTML中插入JavaScript代码的方式
  8. PL/SQL 编程(二)
  9. java优先队列_Java高级特性增强-多线程
  10. python数据对比找不同_利用Python读取文件的四种不同方法比对
  11. keba驱动器_KEBA控制器说明书
  12. [视频访谈翻译]David Kaneda访谈:移动HTML5设计和开发
  13. vue滑杆_Vue无限滑杆组件
  14. Day 15 正则表达式
  15. 微信小程序毕业设计开题报告医院预约挂号小程序+后台管理系统|前后分离VUE.js
  16. CentOS7镜像阿里云下载
  17. 阿里云redis学习笔记
  18. [移动] Mosquitto简要教程(安装/使用/测试)
  19. eclipse卡死问题优化
  20. unity3d播放透明mov格式视频的一种方式

热门文章

  1. Java语言程序设计基础篇原书第十版第二章编程练习题答案
  2. 洛谷 1078 文化之旅
  3. 远程连接基于VMware虚拟机的linux操作系统
  4. MySQL软件多次安装失败解决方案
  5. Android中从视频中提取音频
  6. DMZ network
  7. 滤波器基础03——Sallen-Key滤波器、多反馈滤波器与Bainter陷波器
  8. OpenGL Android 安卓 入门 GLES20 初学者 初级 官方
  9. [单片机学习笔记](35):串级PID算法应用剖析、通过串口控制电机、MPU6050获取平衡车姿态、自制平衡车PID算法程序设计
  10. virt-manager的虚拟资源中心