有一个神奇的口袋,总的容积是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. CentOS6.5下安装配置MySQL数据库

    一.MySQL简介 说到数据库,我们大多想到的是关系型数据库,比如MySQL.Oracle.SQLServer等等,这些数据库软件在Windows上安装都非常的方便,在Linux上如果要安装数据库,咱 ...

  2. fileInputStream.available()获取 文件的总大小

    available():返回与之关联的文件的字节数 我们用inputStream.available()获取 文件的总大小

  3. Python 新建程序

    1.建立一个新的文件夹 2.建一个包 3.建一个程序项目 4.默认模板配置

  4. Python中数据类型

    一.整数 Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用 ...

  5. Yandex.Algorithm 2018, final round

    Yandex.Algorithm 2018, final round A Smart Vending B LIS vs. LDS C Eat And Walk D Search Engine E Gu ...

  6. BZOJ 3585 mex

    题目已经没有了 思路: 莫队+分块 首先有一个结论:所有的答案都在0到n之间,用反正法就能证明,所以所有大于n的数都可以看成n 离线,对询问区间进行莫队,再对答案的范围0到n进行分块 复杂度(n+2* ...

  7. 有关C#中List排序的总结

    这里有一篇文章作者总结的就比较详细: https://blog.csdn.net/jimo_lonely/article/details/51711821 在这里只记录一点: 对list或者数组中的数 ...

  8. ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

    理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...

  9. tomcat启动问题,卡在 preparing launch delegate 100% 的解决方法

    今天在打开eclipse中的tomcat时,每次用debug模式启动的时候总是会在preparing launch delegate到100%的时候卡主,起初以为是tomcat启动时间45s不够,于是 ...

  10. apiCloud 浏览图片

    点击链接查看api详情 https://docs.apicloud.com/Client-API/Func-Ext/photoBrowser var photoBrowser = api.requir ...