hdu 2546 饭卡

题目描述:...

分析:因为只要剩余金额大于5肯定会支付成功,那么最优的办法肯定是要用最后的钱去买最贵的。只需要对除了最贵的物品之外的物品进行背包就可以。其中背包的容量是原来的减5

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 1010
 5 using namespace std;
 6 int dp[N],w[N];
 7 int main(){
 8     int n,m;
 9     while(cin>>n){
10         if(!n)return 0;
11         for(int i=1;i<=n;i++)cin>>w[i];
12         cin>>m;
13         sort(w+1,w+1+n);
14         memset(dp,0,sizeof(dp));
15         if(m<5){
16             cout<<m<<endl;
17             continue;
18         }
19         m-=5;
20         for(int i=1;i<n;i++)
21             for(int j=m;j>=w[i];j--)
22                 dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
23         cout<<(m+5)-(dp[m]+w[n])<<endl;
24     }
25     return 0;
26 }

 

posted @ 2012-10-20 21:23  silver__bullet  阅读(120)  评论(0编辑  收藏  举报