神奇的口袋(dp)
有一个神奇的口袋,总的容积是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)的更多相关文章
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- dp 神奇的口袋
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--an.Joh ...
- 九度OJ 1114:神奇的口袋 (DFS、DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个 ...
- [codeup] 2044 神奇的口袋
题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...
- 九度oj 题目1114:神奇的口袋
题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...
- BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )
把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...
- 【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)
[BZOJ1416/1498][NOI2006]神奇的口袋(数论,概率) 题面 BZOJ1416 BZOJ1498 洛谷 题面都是图片形式是什么鬼.. 题解 考虑以下性质 1.\(x[1],x[2]. ...
- OpenJudge 2755:神奇的口袋
总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体 ...
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
随机推荐
- ORA-00604的解决方法
分类: Oracle 从错误的角度可以推出:应该是表空间不足 根据查看表空间的使用情况: select b.file_name 物理文件名, b.tablespace_name 表空间, b.by ...
- leecode第一百零四题(二叉树的最大深度)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- leecode第二十一题(合并两个有序链表)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- 《剑指offer》第四十八题(最长不含重复字符的子字符串)
// 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...
- zlib交叉编译
下载 zlib-1.2.9.tar.gz wget http://www.zlib.net/fossils/zlib-1.2.9.tar.gz 解压文件 tar -zxvf zlib-1.2.9.ta ...
- 学习笔记56—Endnote参考文献格式调整
论文写作
- 学习笔记5—Python 将多维数据转为一维数组 (总结)
<code class="language-python">import operator from functools import reduce a = [[1,2 ...
- JS中UTF-8和UTF-16互转
1.由于服务端使用的Go,默认是使用UTF-8编码的,而JS默认是Unicode编码的(也就是UTF-16),所以为了字符串编码的一致性,将前端字符串数据编码转换为UTF-8之后再发送给服务端,服务端 ...
- 第 5 章 网络 - 031 - none和host网络的适用场景
none和host网络的适用场景 Docker 安装时会自动在 host 上创建三个网络,用 docker network ls 命令查看: root@ubuntu:~# docker network ...
- Redis持久化AOF和RDB对比
RDB持久化 AOF持久化 全量备份,一次保存整个数据库 增量备份,一次保存一个修改数据库的命令 保存的间隔较长 保存的间隔默认一秒 数据还原速度快 数据还原速度一般 save会阻塞,但bgsave或 ...