UVA - 10465 Homer Simpson

来源:互联网 发布:c难还是java难 编辑:程序博客网 时间:2024/05/18 01:43

题意:在尽量让时间不浪费的情况下使得吃的汉堡最多

贪心:

#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;}