百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】
3
20
20
20
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【递推】的更多相关文章
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- NYOJ 10 skiing (深搜和动归)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...
- 深搜基础题目 杭电 HDU 1241
HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...
- DFS-BFS(深搜广搜)原理及C++代码实现
深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来. 深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点. 广搜简单地说就是一层一层的搜,像水的波纹一样 ...
- HDOJ/HDU 1015 Safecracker(深搜)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
- [codevs1049]棋盘染色<迭代深搜>
题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...
- C++ 深搜调错
因为前两天某网站的比赛一个深搜错了,我只得了3等奖,我找不到错误,给别的大佬看他们又嫌恶心.emm……,比赛结束后我自己反思了一下,深搜写错了该怎么办,或者说怎样避免写错. 首先,变量名不要太ex,比 ...
- [深搜]C. 【例题3】虫食算
C . [ 例 题 3 ] 虫 食 算 题目解析 正解 : Dfs + 剪枝 依题意,把样例以加法的形式展现出来. 根据加法的性质,可以得出有两种情况:有进位和没有进位的. 而从百位到最高位的结果,又 ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- Set Keep-Alive Values---C到C#代码的转换
一.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HT ...
- 重新开始学习javase_集合_Map
一,Map之HashMap(转:http://blog.csdn.net/zheng0518/article/details/42197049) 1. HashMap概述: HashMap是基于 ...
- Spring AOP (下)
4.方式二:schema配置 a.业务类: /** * 业务类 * * @author yanbin * */ public class AspectBusiness { /** * 切入点 */ p ...
- 支持mdev的init脚本片断
mount -t tmpfs mdev /dev mount -t sysfs sysfs /sys mkdir /dev/pts mount -t devpts devpts /dev/pts ec ...
- css行级块级区别总结摘录
一.块级元素:block element 每个块级元素默认占一行高度,一行内添加一个块级元素后无法一般无法添加其他元素(float浮动后除外).两个块级元素连续编辑时,会在页面自动换行显示.块级元素一 ...
- window.clearInterval与window.setInterval的用法 定时器的设置
window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的Java ...
- uva 10820 (筛法构造欧拉函数)
send a table When participating in programming contests, you sometimes face the following problem: Y ...
- Android 判断当前设备是手机还是平板
Android开发需要适配手机和平板,有些需求实现时就要求判断设备是手机还是平板.网上很多说通过设备尺寸.DPI.版本号.是否具备电话功能等进行判断,不过都不算太精确.这里分享一个简洁给力的方法(官方 ...
- redis 基本使用
Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...
- 【转】Java 中字符串的格式化
原文网址:http://blog.csdn.net/aimartt/article/details/8307237 参考资料:JDK API 1.6.0 中文文档 1.格式字符串语法 产生格式化输出的 ...