总Time Limit: 
10000ms 
Memory Limit: 
65536kB

有一个奇妙的口袋。总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40。John如今有n个想要得到的物品,每一个物品的体积各自是a1,a2……an。John能够从这些物品中选择一些,假设选出的物体的整体积是40,那么利用这个奇妙的口袋。John就能够得到这些物品。如今的问题是,John有多少种不同的选择物品的方式。
Input
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数。分别给出a1。a2……an的值。
Output
输出不同的选择物品的方式的数目。

Sample Input
3
20
20
20
Sample Output
3

这题非常经典,能够用非常多方法来做,我试了下面几种:

DFS:耗时0ms

#include <stdio.h>

int arr[22], ans, n, sum;

void DFS(int k)
{
if(sum >= 40){
if(sum == 40) ++ans;
return;
}
for(int i = k; i <= n; ++i){
sum += arr[i];
DFS(i + 1);
sum -= arr[i];
}
} int main()
{
int i;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", arr + i);
sum = ans = 0; DFS(1);
printf("%d\n", ans);
return 0;
}

普通递归:耗时60ms

#include <stdio.h>

int arr[22], n;

int getAns(int sum, int k)
{
if(sum == 0) return 1;
if(k == 0) return 0;
return getAns(sum, k - 1) + getAns(sum - arr[k], k - 1);
} int main()
{
int i;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
scanf("%d", arr + i);
printf("%d\n", getAns(40, n));
return 0;
}

DP:耗时0ms

#include <stdio.h>

int arr[22], n, dp[42][22];
//dp[i][j]表示从前j种物品里配出价值i的方法数
int main()
{
int i, j;
scanf("%d", &n);
for(i = 1; i <= n; ++i){
scanf("%d", arr + i);
dp[0][i] = 1;
}
for(dp[0][0] = i = 1; i <= 40; ++i){
for(j = 1; j <= n; ++j){
dp[i][j] = dp[i][j - 1];
if(i - arr[j] >= 0) dp[i][j] += dp[i - arr[j]][j - 1];
}
}
printf("%d\n", dp[40][n]);
return 0;
}

递推型DP:耗时0ms

#include <stdio.h>

int n, sum[42];
//sum[i]表示价值能组成i的方法数
int main()
{
int i, j, temp;
scanf("%d", &n);
for(i = 0, sum[0] = 1; i < n; ++i){
scanf("%d", &temp);
for(j = 40; j; --j){
if(j + temp > 40) continue;
if(sum[j]) sum[j + temp] += sum[j];
}
++sum[temp];
}
printf("%d\n", sum[40]);
return 0;
}

百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】的更多相关文章

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

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

  2. NYOJ 10 skiing (深搜和动归)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...

  3. 深搜基础题目 杭电 HDU 1241

    HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...

  4. DFS-BFS(深搜广搜)原理及C++代码实现

    深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来. 深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点. 广搜简单地说就是一层一层的搜,像水的波纹一样 ...

  5. HDOJ/HDU 1015 Safecracker(深搜)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

  6. [codevs1049]棋盘染色<迭代深搜>

    题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...

  7. C++ 深搜调错

    因为前两天某网站的比赛一个深搜错了,我只得了3等奖,我找不到错误,给别的大佬看他们又嫌恶心.emm……,比赛结束后我自己反思了一下,深搜写错了该怎么办,或者说怎样避免写错. 首先,变量名不要太ex,比 ...

  8. [深搜]C. 【例题3】虫食算

    C . [ 例 题 3 ] 虫 食 算 题目解析 正解 : Dfs + 剪枝 依题意,把样例以加法的形式展现出来. 根据加法的性质,可以得出有两种情况:有进位和没有进位的. 而从百位到最高位的结果,又 ...

  9. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

随机推荐

  1. Set Keep-Alive Values---C到C#代码的转换

    一.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HT ...

  2. 重新开始学习javase_集合_Map

    一,Map之HashMap(转:http://blog.csdn.net/zheng0518/article/details/42197049) 1.    HashMap概述: HashMap是基于 ...

  3. Spring AOP (下)

    4.方式二:schema配置 a.业务类: /** * 业务类 * * @author yanbin * */ public class AspectBusiness { /** * 切入点 */ p ...

  4. 支持mdev的init脚本片断

    mount -t tmpfs mdev /dev mount -t sysfs sysfs /sys mkdir /dev/pts mount -t devpts devpts /dev/pts ec ...

  5. css行级块级区别总结摘录

    一.块级元素:block element 每个块级元素默认占一行高度,一行内添加一个块级元素后无法一般无法添加其他元素(float浮动后除外).两个块级元素连续编辑时,会在页面自动换行显示.块级元素一 ...

  6. window.clearInterval与window.setInterval的用法 定时器的设置

    window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的Java ...

  7. uva 10820 (筛法构造欧拉函数)

    send a table When participating in programming contests, you sometimes face the following problem: Y ...

  8. Android 判断当前设备是手机还是平板

    Android开发需要适配手机和平板,有些需求实现时就要求判断设备是手机还是平板.网上很多说通过设备尺寸.DPI.版本号.是否具备电话功能等进行判断,不过都不算太精确.这里分享一个简洁给力的方法(官方 ...

  9. redis 基本使用

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...

  10. 【转】Java 中字符串的格式化

    原文网址:http://blog.csdn.net/aimartt/article/details/8307237 参考资料:JDK API 1.6.0 中文文档 1.格式字符串语法 产生格式化输出的 ...