您的位置:首页 > 其它

UVA - 10465 Homer Simpson 01背包问题(无限)

2014-11-11 23:45 246 查看
题目大意:有两种汉堡,吃第一个汉堡要花T1的时间,吃第二个要花T2的时间,要求再规定的时间内尽量把时间用光去吃汉堡,如果时间用不光的话,就把多余的时间花去喝酒,求如果时间都用光的话,吃了几个汉堡,如果用不光的话,就把喝的酒数也输出来

解题思路:01背包的无限物品问题,用一维数组解决

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10005
int t[3];
int nu;
int dp[maxn];
int num[maxn];
int main() {
	while(scanf("%d", &t[1]) != EOF) {

		scanf("%d",&t[2]);
		scanf("%d",&nu);
		memset(dp,0,sizeof(dp));
		memset(num,0,sizeof(num));
		int i , j;
		for( i = 1; i <= 2; i++)
			for( j = t[i] ; j <= nu; j++) {
				if(dp[j-t[i]] + t[i] > dp[j] )	{
					dp[j] = dp[j-t[i]] + t[i];	
					num[j] = num[j-t[i]] + 1;	
				}
				else if(dp[j-t[i]] + t[i] == dp[j] && num[j-t[i]] + 1 > num[j]) 
					num[j] = num[j-t[i]] + 1;
			}
		if(dp[nu] == nu)
			printf("%d\n",num[nu]);
		else
			printf("%d %d\n", num[nu],nu-dp[nu]);	
			
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: