题目大意:有两种汉堡,吃第一个汉堡要花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;
}