UVA10645完全背包

来源:互联网 发布:linux如何退出切换用户 编辑:程序博客网 时间:2024/06/05 09:07

题目链接: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;}


0 0
原创粉丝点击