题目描述
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中的两句话的由来。
完整代码
#include<bits/stdc++.h>
using 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<<lz;
return 0;
}
算法:深搜#