题目描述
Bessie每天摄入的卡路里每天不能超过C(10 <= C <=35,000)。 农夫约翰正在测试
B(1 <= B <= 21)饲料桶,每个饲料中有一些(可能不唯一)卡路里数(范围:1..350000)。 Bessie没有自我控制能力:一旦她从饲料桶开始,她就把它吃完。
Bessie组合数学不是很好。给Bessie尽可能多的热量
不超过限制C. 确定最优组合的饲料桶方案
例如,考虑40卡路里和6桶的限制
7,13,17,19,29,和31卡路里。 贝西可以吃7 + 31 = 38
卡路里,但可以吃更多的消耗三个桶:7 +13 + 19 = 39卡路里。 她找不到更好的组合。
输入
第1行:两个用空格分开的正整数C和B
第2行:B个正整数,表示B桶饲料所含的卡路里数
输出
1行, Bessie可以消耗卡路里的最大数。
样例输入
40 6 7 13 17 19 29 31
样例输出
39
这道题可以用01背包做,但我很懒(^_^),而且2^21也才209万,所以用搜索了,呵呵呵。
函数伪代码
if(超出范围){
if(符合条件) maxn=max(maxn);
return ;
}
else{
Dfs(做的位置+1,和);
Dfs(做的位置+1,和+做的这个值);
}
一个值,只有两种状态:用和不用,这就是else中的两句话的由来。
完整代码
#includeusing namespace std; int c,b,a[25],lz; void Dfs(int t,int s){ if(s>c) return ; //剪枝优化,免得超时 if(t>b){ if(s<=c) lz=max(lz,s); //求最大 return ; } else{ Dfs(t+1,s); //不用 Dfs(t+1,s+a[t]); //用 } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>c>>b; for(int i=1;i<=b;i++) cin>>a[i]; Dfs(1,0); cout< 算法:深搜#



