神奇的口袋(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 ...
随机推荐
- JavaScript的案例(数据校验,js轮播图,页面定时弹窗)
1.数据校验 步骤 1.确定事件(onsubmit)并绑定一个函数 2.书写这个函数,获取数据,并绑定id 3. ...
- 串口.Qt532测试(异步)
环境:Win7x64.Qt5.3.2 MSVC OpenGL(x86).vs2010(x86) 项目所在位置:E:\Project_Qt532\SeriesPort_Qt532_Z ZC:这里 同步方 ...
- 随机--相关(Fisher_Yates算法)
Fisher_Yates算法 void ShuffleArray_Fisher_Yates(char* arr, int len) { int i = len, j; char t ...
- python3.5学习第一章
在python中,变量赋值或者其他语句后不需要加”:“ python中,缩进特别重要! 条件语句和循环语句,要加”:“ 一.变量赋值 name = "cecelia"name2 = ...
- 人脸识别demo使用教程
最近在研究虹软家的arcface 人脸识别 demo,现在就给大家分享一下官方的demo**工程如何使用? **1.下载代码:git clone https://github.com/asdfqwra ...
- JAVA基础知识总结:十九
一.多线程使用过程中的临界资源问题 1.临界资源:被多个线程同时访问的资源 临界资源产生的原因:有多个线程同时访问一个资源的时候,如果一个线程在取值的过程中,时间片又被其他的线程抢走了,临界资源问题就 ...
- flex属性的学习
1.需要记住的属性和值. ------------------------------------------------------------- 方向横和纵 flex-direction: row ...
- jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第一话):初次启动jenkins,输入给定密码后登录失败问题解决
Jenkins是一个持续集成平台,它能够从git等源码管理服务器拉取代码.打包并发布到tomcat等中间件,只要配置好相关插件,就可以做到项目的自动化构建.部署,不论是对开发来说监控代码质量,还是对测 ...
- 最简单的解决Chrome浏览器主页被hao123、360和2345篡改的方法是什么
最简单的解决Chrome浏览器主页被hao123.360和2345篡改的方法是什么 一.总结 一句话总结:打开chrome的安装目录,将chrome.exe改成chrome1.exe即可,然后发送一个 ...
- Ubuntu自带截图工具screenshoot