HDOJ 2546 饭卡 (01背包)

来源:互联网 发布:电影网源码php 编辑:程序博客网 时间:2024/04/30 20:51

http://acm.hdu.edu.cn/showproblem.php?pid=2546

题意:卡内有m元钱,有n种菜可以买(每种菜只可以买一次),只要卡内金额大于等于5元就可以买任何菜(刷到负也可以)。求最少可使卡上的余额为多少。

思路:最贵的一个菜一定是最后买,然后用01背包求(m-5)元钱可买的菜的最大金额,然后(m-最大金额-最贵的菜的价钱)即为所求。

#include<stdio.h>#include<string.h>#define maxn 1111int val[maxn],f[maxn];main(){int n,m,i,j,max,pos;while(scanf("%d",&n)&&n){for(i=1;i<=n;i++)scanf("%d",&val[i]);scanf("%d",&m);if(m<5){printf("%d\n",m);continue;}for(max=-1,pos=0,i=1;i<=n;i++)if(max<val[i]){max=val[i];pos=i;}memset(f,0,sizeof(f));for(i=1;i<=n;i++){if(pos==i)continue;for(j=m-5;j>=val[i];j--)if(f[j]<f[j-val[i]]+val[i])f[j]=f[j-val[i]]+val[i];}printf("%d\n",m-f[m-5]-max);}return 0;}


原创粉丝点击