问题描述:给出m,n,t,m为吃第一种汉堡的时间,n为第二种汉堡的时间,t为总时间,
如果总时间全部用于吃汉堡,那么就输出最多能吃多少个汉堡,否则在剩余时间喝啤酒。
输出且汉堡的数量最大,且喝啤酒的时间最小。
解析:完全背包问题,即把01背包的时间从前往后dp。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[10005];
int main() {
int w[2],t;
while(scanf("%d%d%d",&w[0],&w[1],&t) != EOF) {
memset(dp,-1,sizeof(dp));
dp[0] = 0;
for(int i = 0; i < 2; i++) {
for(int j = w[i]; j <= t; j++) {
if(dp[j - w[i]] != -1)
dp[j] = max(dp[j] , dp[j - w[i]] + 1) ;
}
}
int i;
for(i = t; i >= 0; i--) {
if(dp[i] != -1) {
break;
}
}
if(i == t)
printf("%d\n",dp[t]);
else
printf("%d %d\n",dp[i], t - i);
}
return 0;
}