[动态规划]UVA10465 - Homer Simpson

Return of the Aztecs

Problem C:Homer Simpson

Time Limit: 3 seconds
Memory Limit: 32 MB

Homer Simpson, a very smart guy, likes eating Krusty-burgers. It takes Homer m minutes to eat a Krusty- burger. However, there�s a new type of burger in Apu�s Kwik-e-Mart. Homer likes those too. It takes him n minutes to eat one of these burgers. Given t minutes, you have to find out the maximum number of burgers Homer can eat without wasting any time. If he must waste time, he can have beer.

Input

Input consists of several test cases. Each test case consists of three integers m, n, t (0 < m,n,t < 10000). Input is terminated by EOF.

Output

For each test case, print in a single line the maximum number of burgers Homer can eat without having beer. If homer must have beer, then also print the time he gets for drinking, separated by a single space. It is preferable that Homer drinks as little beer as possible.

Sample Input

3 5 54
3 5 55

Sample Output

18
17

Problem setter: Sadrul Habib Chowdhury
Solution author: Monirul Hasan (Tomal)

Time goes, you say? Ah no!
Alas, Time stays, we go.
-- Austin Dobson


题意:

荷马.辛普森(Homer Simpson)是一个非常聪明的家伙。他很喜欢吃两种汉堡(我们称为A和B好了)。他吃一个A汉堡需要m 分钟,吃一个B汉堡需要n 分钟。如果有t 分钟时间的话,请你找出在不浪费一点点时间的情形下,辛普森先生最多可以吃多少个汉堡。如果必须要浪费时间(这个时候辛普森会喝啤酒),也请你找出尽可能少喝啤酒的情况下,他最多可以吃几个汉堡,还有花多少分钟喝啤酒。

以Sample Input的三组测试资料为例说明:

  • t=54, m=3, n=5 我们可以找到最多吃18 个A汉堡使得不浪费一点时间(3*18=54)。
  • t=55, m=3, n=5 我们可以找到最多吃15 个A 汉堡和2 个B汉堡使得不浪费一点时间(3*15+2*5=55)。
  • t=7, m=5, n=3 我们可以找到最多吃2 个B 汉堡且必须浪费1 分钟时间。
思路:注意看题目首先要不浪费时间,再尽量多吃汉堡,这是一个完全背包的题目,需要注意的是如果时间相同的话,需要选择多吃汉堡。
#include<iostream>
#include<cstring>

using namespace std;

int dp[5][10005],path[5][10005];
int arry[5];

int main()
    {
        int m,n,t;
        while(cin>>m>>n>>t)
            {
                arry[0]=m,arry[1]=n;
                memset(dp,0,sizeof(dp));
                memset(path,0,sizeof(path));
                for(int i=0;i<2;i++)
                    {
                        for(int j=0;j<=t;j++)
                            {
                                if(j<arry[i])
                                    {
                                        dp[i+1][j]=dp[i][j];
                                        path[i+1][j]=path[i][j];
                                    }
                                else
                                    {
                                        if(dp[i][j]>dp[i+1][j-arry[i]]+arry[i]||(dp[i][j]==dp[i+1][j-arry[i]]+arry[i]&&path[i][j]>path[i+1][j-arry[i]]))
                                            {
                                                dp[i+1][j]=dp[i][j];
                                                path[i+1][j]=path[i][j];
                                            }
                                        else if(dp[i][j]<dp[i+1][j-arry[i]]+arry[i]||(dp[i][j]==dp[i+1][j-arry[i]]+arry[i]&&path[i][j]<=path[i+1][j-arry[i]]))
                                            {
                                                dp[i+1][j]=dp[i+1][j-arry[i]]+arry[i];
                                                path[i+1][j]=path[i+1][j-arry[i]]+1;
                                            }
                                        //dp[i+1][j]=max(dp[i][j],dp[i+1][j-arry[i]]+arry[i]);
                                    }
                            }
                    }
                //cout<<dp[2][t]<<endl;
                cout<<path[2][t];
                if(t-dp[2][t]!=0) cout<<" "<<t-dp[2][t]<<endl;
                else cout<<endl;
            }
        return 0;
    }


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值