HDOJ2546 饭卡(0/1背包)

来源:互联网 发布:大圣美人进阶数据 编辑:程序博客网 时间:2024/05/31 18:36

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546


根据题目,当只剩下5元的时候,肯定选择最贵的菜。

所以,直接用5元买最贵的菜,剩下的钱没有限制,所以直接用0/1背包解就可以了


/*HDOJ2546作者:陈佳润2013-04-17*/#include<iostream>#include<string.h>using namespace std;#define max(a,b) (a>b?a:b)int good[1005];//菜的价格int dp[50005];//dp数组int n;//菜的种类数目int m;//卡的越void Zero_One_Pack(int value,int weight){//0/1背包int j;for(j=m;j>=weight;j--){dp[j]=max(dp[j],dp[j-weight]+value);}}int main(){int i,maxIndex,maxValue;//freopen("1.txt","r",stdin);while(cin>>n&&n){for(i=1;i<=n;i++)//读取菜的价格cin>>good[i];cin>>m;//读取卡余额if(m<5){//如果卡不足5元cout<<m<<endl;continue;}//找出最贵的菜maxIndex=1;maxValue=good[1];for(i=2;i<=n;i++){if(maxValue<good[i]){maxValue=good[i];maxIndex=i;}}good[maxIndex]=0;//选中那个菜,所以让它的价格变成0,相当于删掉它m-=5;//花了5块去点那个最贵的memset(dp,0,sizeof(dp));//初始化for(i=1;i<=n;i++)//背包Zero_One_Pack(good[i],good[i]);cout<<m-dp[m]+5-maxValue<<endl;}return 0;}


原创粉丝点击