HDU 2546 饭卡(01背包裸题)
生活随笔
收集整理的這篇文章主要介紹了
HDU 2546 饭卡(01背包裸题)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
飯卡
Time Limit: 5000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28562????Accepted Submission(s): 9876
Problem Description 電子科大本部食堂的飯卡有一種很詭異的設(shè)計(jì),即在購(gòu)買之前判斷余額。如果購(gòu)買一個(gè)商品之前,卡上的剩余金額大于或等于5元,就一定可以購(gòu)買成功(即使購(gòu)買后卡上余額為負(fù)),否則無(wú)法購(gòu)買(即使金額足夠)。所以大家都希望盡量使卡上的余額最少。 某天,食堂中有n種菜出售,每種菜可購(gòu)買一次。已知每種菜的價(jià)格以及卡上的余額,問最少可使卡上的余額為多少。 Input 多組數(shù)據(jù)。對(duì)于每組數(shù)據(jù): 第一行為正整數(shù)n,表示菜的數(shù)量。n<=1000。 第二行包括n個(gè)正整數(shù),表示每種菜的價(jià)格。價(jià)格不超過50。 第三行包括一個(gè)正整數(shù)m,表示卡上的余額。m<=1000。n=0表示數(shù)據(jù)結(jié)束。 Output 對(duì)于每組輸入,輸出一行,包含一個(gè)整數(shù),表示卡上可能的最小余額。 Sample Input 1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0 Sample Output -45 32 Source UESTC 6th Programming Contest Online 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 分析: 很經(jīng)典的一道01背包題,要注意的是這里只要剩余的錢不低于5元,就可以購(gòu)買任何一件物品,所以5在這道題中是很特殊的,在使用01背包之前,我們首先要在現(xiàn)在所擁有的余額中保留5元,用這五元去購(gòu)買最貴的物品(此處默認(rèn)最貴的比5元貴了),而剩下的錢就是背包的總?cè)萘?#xff0c;可以隨意使用! 注意:數(shù)組要放循環(huán)里面清零,否則會(huì)WA(我不會(huì)告訴你做這道題我WA了7次QAQ) 下面給出AC代碼: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int price[1010],dp[1010]; 6 int n; 7 while(scanf("%d",&n)&&n) 8 { 9 memset(price,0,sizeof(price)); 10 memset(dp,0,sizeof(dp)); 11 for(int i=1;i<=n;i++) 12 cin>>price[i]; 13 sort(price+1,price+1+n); 14 int MAXN=price[n]; 15 int res; 16 cin>>res; 17 if(res<5) 18 { 19 cout<<res<<endl; 20 continue; 21 } 22 res-=5; 23 for(int i=1;i<n;i++) 24 { 25 for(int j=res;j>=price[i];j--)//01背包主函數(shù) 26 { 27 dp[j]=max(dp[j],dp[j-price[i]]+price[i]); 28 } 29 } 30 printf("%d\n",res+5-dp[res]-MAXN); 31 } 32 return 0; 33 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/ECJTUACM-873284962/p/6819150.html
總結(jié)
以上是生活随笔為你收集整理的HDU 2546 饭卡(01背包裸题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻松记账工程冲刺第二天
- 下一篇: 前端开发的模块化和组件化的定义,以及两者