九度oj 题目1114:神奇的口袋
- 题目描述:
-
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
- 输入:
-
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
- 输出:
-
输出不同的选择物品的方式的数目。
- 样例输入:
-
3
20
20
20
- 样例输出:
-
3
#include <cstdio>
#include <cstring>
int weight[],flag[],cnt,n;
void dfs(int n, int w) {
if(w == ) {
cnt++;
return;
}
for(int i = n-; i >= ; i--) {
if(flag[i] == && w + weight[i] <= ) {
flag[i] = ;
dfs(i, w + weight[i]);
flag[i] = ;
}
}
}
int main()
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&weight[i]);
}
memset(flag, , sizeof(flag));
cnt = ;
dfs(n, );
printf("%d\n", cnt);
}
return ;
}用回溯法可以求解,当然也可以用动态规划
既可以用二维数组,代码如下
#include <cstdio>
#include <cstring> int dp[][];//wupin rongliang
int weight[],n;
//dp[i][r] = dp[i-1][r] + dp[i-1][r-weight[i]]; int main()
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&weight[i]);
}
memset(dp,,sizeof(dp));
for(int i = ; i < n; i++) {
dp[i][] = ;
}
dp[][weight[]] = ;
for(int r = ; r <= ; r++) {
for(int i = ; i < n; i++) {
if(r >= weight[i]) {
dp[i][r] = dp[i-][r] + dp[i-][r-weight[i]];
}
else {
dp[i][r] = dp[i-][r];
}
}
}
printf("%d\n", dp[n-][]);
}
return ;
}也可以用一维数组,代码如下
#include <cstdio>
#include <cstring>
int dp[];
int weight[],n;
int main(){
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&weight[i]);
}
memset(dp,,sizeof(dp));
dp[] = ;
for(int i = ; i < n; i++) {
for(int r = ; r >= weight[i]; r--) {
dp[r] = dp[r-weight[i]] + dp[r];
}
}
printf("%d\n", dp[]);
}
return ;
}
九度oj 题目1114:神奇的口袋的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- SQL注入原理与解决方法代码示例
一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 ...
- debian中sudo无法使用问题
原文链接:http://sharadchhetri.com/2013/08/07/sudo-command-not-found-debian-7/ To solve this issue instal ...
- IP Addresses of Google Global Cache
Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 93.123.23.6 93.123.23.7 93.123. ...
- Django之Form组件整理
搬运自:http://www.cnblogs.com/haiyan123/p/7795771.html 一.Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验 ...
- 一张图告诉你,只会这些HTML还远远不够!!!!!
不知道自己HTML水平如何,不知道HTML5如何进化?看这张图 如果一半以上的你都不会,必须看这本书,阿里一线工程师用代码和功能页面来告诉你每一个技术点. 都会一点,但不知道如何检验自己,看看本书提供 ...
- [windows]设置开机取消登录窗口选项直接进入桌面
步骤: 菜单--〉运行--〉输入:control passwords2或rundll32 netplwizdll,UsersRunDll--〉用户账户-用户-取消勾选“要使用本机,用户必须输入用户名和 ...
- MySQL备份和还原数据库及慢查询日志使用
- ubuntu 14.04 配置java 1.8环境变量
从官网上下载jdk 源文件,并解压 root@hett-PowerEdge-T30:/usr/local/src# tar -xzvf jdk-8u151-linux-x64.tar.gz 解压完成之 ...
- SQLite连接
SQLite -连接 SQLite的联接子句用于从数据库中的两个或多个表合并的记录.JOIN是用于通过使用共同的每个值从两个表结合域的装置. SQL定义了三个主要类型的连接: CROSS JOIN I ...
- RLock(递归锁)
import threading, time def run1(): print("grab the first part data") lock.acquire()#进入大门后的 ...