首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

HDOJ 2546 饭卡 (01双肩包)

2012-08-15 
HDOJ 2546 饭卡 (01背包)http://acm.hdu.edu.cn/showproblem.php?pid2546题意:卡内有m元钱,有n种菜可以买

HDOJ 2546 饭卡 (01背包)

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;}


热点排行