题意:在尽量让时间不浪费的情况下使得吃的汉堡最多
贪心:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 10005;
int dp[MAXN],num[MAXN];
int main(){
int m,n,t;
while (scanf("%d%d%d",&m,&n,&t) != EOF){
memset(num,0,sizeof(num));
memset(dp,0,sizeof(dp));
for (int i = m; i <= t; i++){
dp[i] = dp[i-m] + m;
num[i] = num[i-m] + 1;
}
for (int j = n; j <= t; j++){
if (dp[j - n] + n > dp[j]){
dp[j] = dp[j-n] + n;
num[j] = num[j-n] + 1;
}
else if (dp[j] == dp[j-n] + n && num[j - n] + 1 > num[j])
num[j] = num[j - n] + 1;
}
if (dp[t] == t)
printf("%d\n",num[t]);
else printf("%d %d\n",num[t],t - dp[t]);
}
return 0;
}
完全背包:价值和重量一样大
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 10005;
int dp[MAXN];
int main(){
int m[2],t;
while (scanf("%d%d%d",&m[0],&m[1],&t) != EOF){
for (int i = 1; i <= t; i++)
dp[i] = -MAXN;
dp[0] = 0;
for (int i = 0; i < 2; i++)
for (int j = m[i]; j <= t; j++){
int t = dp[j - m[i]] + 1;
if (dp[j] < t)
dp[j] = t;
}
for (int i = t; i >= 0; i--)
if (dp[i] >= 0){
if (i == t)
printf("%d\n",dp[t]);
else printf("%d %d\n",dp[i],t-i);
break;
}
}
return 0;
}