UVA10645完全背包

题目链接:http://vjudge.net/contest/view.action?cid=45535#problem/Q

题目:给定一定时间,已知吃一种汉堡用时为m分钟,吃另一种汉堡用时为n分钟,求在保证剩余时间最少的情况下,吃的汉堡的最大数,如果时间有剩余,那么也要输出剩余的时间

题目可以看成是简单的完全背包,不过相当于两次,第一次是在有限时间t内,能装的最大时间,第二次是在有限时间内且剩余时间最少的情况下,能装的最大个数,

#include<stdio.h>
#include<string.h>
#define N 10005
#include<algorithm>
using namespace std;
int dp[N];
int w[5];
int sum[N];
int main()
{
    int m,n,t;
    while(scanf("%d%d%d",&m,&n,&t)!=EOF)
    {
        w[1]=m;w[2]=n;
        memset(sum,0,sizeof(sum));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=2;i++)
        {
            for(int j=w[i];j<=t;j++)
            {
                    if(dp[j]<dp[j-w[i]]+w[i])
                    {
                        dp[j]=dp[j-w[i]]+w[i];
                        sum[j]=sum[j-w[i]]+1;
                    }
                    else if(dp[j]==dp[j-w[i]]+w[i])//注意第一层的情况下,判断最优
                    sum[j]=max(sum[j],sum[j-w[i]]+1);
            }
        }
        if(dp[t]==t)
            printf("%d\n",sum[t]);
        else
            printf("%d %d\n",sum[t],t-dp[t]);
    }
    return 0;
}


你可能感兴趣的:(UVA10645完全背包)