百练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) ...
随机推荐
- rhel安装eclipse
smb --> IDE --> 环境gcc(开发c) g++(开发c++)c++操作linux --> sqlite数据库linux平台自带sqlite数据库 基本SQL语言划分:D ...
- 安卓之cannot convert from Fragment1 to Fragment
在写一个音乐播放器的时候,用到了fragment,结果在需要返回Fragment的方法里面,无法将Fragment1(Fragment的子类)强制转换成Fragment, 很是纳闷,我是参照一个开源代 ...
- 04_RHEL7.1忘记root密码
在开机进入启动项时,选择需要重设密码的那个启动项 按e进入编辑模式,找到rhgb和quiet参数(几乎在最下面),替换为 init=/bin/sh 按ctrl+X不需密码进入shell 以rw的方式重 ...
- sublime常用插件及配置,自留自用
1.Angularjs 写angularjs经常操作template文件,没有一个ng-xx的提示真的很蛋疼是不是,有些服务的名字记不住是不是,那就用这个插件吧 2.AutoFileName 如果你的 ...
- link与@import
导入外部样式的两种写法 <link rel="stylesheet" href="xxxx.css"> <style> @import ...
- python执行shell获取硬件参数写入mysql
最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python ...
- .net发邮件
// 引入命名空间 using System.Net; using System.Net.Mail; SmtpClient smtp = new SmtpClient(); //实例化一个SmtpCl ...
- 转:cookie和session(二)——php应用
文章来自于:http://blog.csdn.net/half1/article/details/21650211 本文将介绍cookie在session在php中的基本用法. 1.cookie ...
- asp.net请求流程
http://developer.51cto.com/art/200902/109441.htm http://www.cnblogs.com/couhujia/archive/2010/04/21/ ...
- Visual studio code (vscode)
调东西 : 左上角 File -> Preferences -> Workspace Settings ( User Settings 也可以, 它是 for 所有的 project, W ...