栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【题解】【USACO2006年DEC铜组】 The Eating Puzzle

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【题解】【USACO2006年DEC铜组】 The Eating Puzzle

题目描述

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
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< 

算法:深搜#

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298432.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号