百练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) ...
随机推荐
- UICollectionView设置item(cell)之间间距为0(紧挨在一起的效果)
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; self.layout = layout ...
- 对C#泛型实例化对像--转
最近在编写一套开发框架结构主要应用.Net 3.5以上的框架开发与应用.在此框架中应用了较多的泛型.下面来讲讲对泛型的实例化,以代码为例,如: public class A { } public cl ...
- Android入门随记
1.Activity是通过startActivity()开始的,结束后不反回任何结果,而用startActivityForResult(Intent intent, int resquestCode) ...
- 78 Subsets(求子集Medium)
题目意思:求解一个数组的所有子集,子集内的元素增序排列eg:[1,3,2] result:[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]思路:这是一个递推的过程 [] ...
- Ajax表单提交插件jquery form
jQuery Form插件是一个优秀的Ajax表单插件,我们可以非常容易的使用它处理表单控件的值,清空和复位表单控件,附件上传,以及完成Ajax表单提交. jQuery Form有两个核心方法ajax ...
- 大数据学习之hadoop伪分布式集群安装(一)公众号undefined110
hadoop的基本概念: Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoo ...
- hdu3949
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- oldboy第五天学习
一.生成器 列表生成器 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> b = [] >>> for i in ...
- 洛谷 P1331 海战
传送门 题解:由于船是方形的,所以比较简单.但是考试的时候跪了,orz.忘了考虑类似一圈井号中间有一摊水. 可以只考虑这个点上方和左边点的情况,这样分为四种情况.一种是左边是一滩水, ...
- C#程序设计基础——数据类型
C#是强类型语言,因此每个变量和对象都必须具有声明类型.数据类型可描述为内置数据类型(如int或char),用户定义数据类型(如class或interface).数据类型还可以定义为值类型(用于存储值 ...