有一个神奇的口袋,总的容积是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

分析:可以用两种方法解决-递归和动态规划

递归解法:

#include<iostream>
#include<algorithm>
using namespace std;
#define N 20 + 5
int n;
int a[N];
int ans;
int jz[N];
void dfs(int cur, int v) {
if(cur > n || v > jz[cur] || v < a[cur]) return;//剪枝
if(v == a[cur]) {
ans++;
dfs(cur+, v);
} else {
dfs(cur+, v);
dfs(cur+, v-a[cur]);
} }
int main() {
while(cin >> n) {
for(int i = ; i <= n; i++) cin >> a[i];
sort(a+, a+n+);
jz[n] = a[n];
for(int i = n-; i >= ; i--) jz[i] = jz[i+] + a[i];
ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
}

动态规划:

状态:把dp[i][j]定义为前j个物品拼成体积为i的方法数

状态转移方程:dp[i][j] += dp[i - a[j]][j-1];

注意:dp[i][j]在最开始应该被赋值为dp[i][j-1],因为前j个物品包含了这j-1个物品

代码:

#include<iostream>
using namespace std;
#define N 20 + 5
int dp[N][N];
int a[N];
int main() {
int n;
while(cin >> n) {
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++) cin >> a[i];
for(int i = ; i <= n; i++) dp[][i] = ;
for(int i = ; i <= ; i++) {
for(int j = ; j <= n; j++) {
dp[i][j] = dp[i][j-];
if(i >= a[j])
dp[i][j] += dp[i - a[j]][j-];
}
}
cout << dp[][n] << endl;
}
return ;
}

神奇的口袋(dp)的更多相关文章

  1. 百练2755:神奇的口袋(简单dp)

    描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...

  2. dp 神奇的口袋

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

  3. 九度OJ 1114:神奇的口袋 (DFS、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个 ...

  4. [codeup] 2044 神奇的口袋

    题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...

  5. 九度oj 题目1114:神奇的口袋

    题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...

  6. BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )

    把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...

  7. 【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)

    [BZOJ1416/1498][NOI2006]神奇的口袋(数论,概率) 题面 BZOJ1416 BZOJ1498 洛谷 题面都是图片形式是什么鬼.. 题解 考虑以下性质 1.\(x[1],x[2]. ...

  8. OpenJudge 2755:神奇的口袋

    总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体 ...

  9. bzoj 1187: [HNOI2007]神奇游乐园 插头dp

    1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 668  Solved: 337[Submit][Statu ...

随机推荐

  1. [原][源码][tinyxml][opencv]按照规格剪切所有的图片

    源码: #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #inclu ...

  2. 力扣(LeetCode) 104. 二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...

  3. 主元素问题 Majority Element

    2018-09-23 13:25:40 主元素问题是一个非常经典的问题,一般来说,主元素问题指的是数组中元素个数大于一半的数字,显然这个问题可以通过遍历计数解决,时间复杂度为O(n),空间复杂度为O( ...

  4. 关于MySQL大量数据分页查询优化

    select * form user id in(select id from user limit 1000000,10);

  5. jquery如何获取checkbox的值

    jquery如何获取checkbox的值 一.总结 一句话总结:就是通过jquery获取哪些对应name的checkbox,然后找出:check(被选中的),然后通过jquery的each遍历获取这些 ...

  6. 2d游戏和 3d游戏的区别

    2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ...

  7. centos 安装npm node

    最近那vue全套造了个管理系统的轮子,发现node简直太好用了. elment-UI的出现就是不懂ui设计的后台工程师的福音~ 正好自己买的两个云服务器空闲着没用,就拿来试试看了 首先软件都安装在/u ...

  8. springboot---->javax.servlet.ServletException

    springboot访问静态资源时发生以下异常: javax.servlet.ServletException: Circular view path [login]: would dispatch ...

  9. 说说secondarynamenode作用和配置

    说说secondarynamenode作用 http://my.oschina.net/u/1464779/blog/289895 说说secondarynamenode的配置 hadoop2.X如何 ...

  10. 微信小程序分享

    点击链接查看详情:(转发的路径的必须写正确) https://mp.weixin.qq.com/debug/wxadoc/dev/api/share.html