码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 2546 饭卡->0-1背包

时间:2015-04-27 23:49:55      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:c   acm   算法   c++   动态规划   

分析:

1、当饭卡余额小于5元直接输出,不能购买菜了。

2、选出一种价值最大的菜最后购买,以尽可能使余额走到负数。

3、以余额减去5作为背包容量,因为只有接近5时,之后才能用来买最大的菜,除去最大菜的每种菜的价格作为价值和重量;以使所卖菜的价格尽可能接近5。

#include<iostream>
#include<algorithm>
using namespace std;  

int val[1001];
int dp[1001];

void DP(int n,int m)
{
	int i,j;

	memset(dp,0,sizeof(dp));
	for(i=0;i<n;i++)
		for(j=m-5;j>=val[i];j--)
			if(dp[j]<dp[j-val[i]]+val[i])
				dp[j]=dp[j-val[i]]+val[i];
}
  
int main()  
{  
	int n,m,i;

	while(cin>>n &&n)
	{
		for(i=0;i<n;i++)
			cin>>val[i];

		cin>>m;
		if(m<5)
		{
			cout<<m<<endl;
		}
		else
		{
			sort(val,val+n);
			DP(n-1,m);
			cout<<m-val[n-1]-dp[m-5]<<endl;
		}
	}
    return 0;      
}


HDU ACM 2546 饭卡->0-1背包

标签:c   acm   算法   c++   动态规划   

原文地址:http://blog.csdn.net/a809146548/article/details/45317167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!