您的位置:首页 > 其它

uva 10465 (完全背包)

2016-04-01 10:48 316 查看
【题意】有两种食物(数量无限)是Simpson喜欢的,每种食物都需要一个进食时间,现在他有时间t,
              问能最多吃多少个食物,时间尽量用完,用不完求最小浪费时间情况下的最多能吃的实物数量。

【解题思路】完全背包,除了0之外其他初始化为负无穷大,不断贪心取正值即可。(根据贪心的思想,当前的最优解必定由上一个最优解转移而来,可以用个for循环枚举物品个数,这里由于只有2个,因此直接1个1个枚举也可以,这里才用后者!)

【AC代码】

#include <stdio.h>
using namespace std;
const int maxn = 10010;
const int inf = 100001;
int dp[maxn];

int main()
{
int m,n,t;
while(~scanf("%d%d%d",&m,&n,&t))
{
for(int i=1; i<=t; i++)dp[i]=-inf;
dp[0]=0;
for(int i=m; i<=t; i++)
{
if(dp[i]<dp[i-m]+1)
{
dp[i] = dp[i-m]+1;
}
}
for(int i=n; i<=t; i++)
{
if(dp[i]<dp[i-n]+1)
{
dp[i]=dp[i-n]+1;
}
}
int tmp=t;
while(dp[tmp]<0)tmp--;
if(t==tmp)
{
printf("%d\n",dp[tmp]);
}
else
{
printf("%d %d\n",dp[tmp],t-tmp);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: