CDOJ--1012

原题链接:http://acm.uestc.edu.cn/problem.php?pid=1012

分析:dp[v]表示可以使用的钱为v时实际上用的钱。

饭卡(card) 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<functional>
 5 #include<cstring>
 6 using namespace std;
 7 int m,n,i,v,price[1001],dp[1001];
 8 int main()
 9 {
10     while(scanf("%d",&n)==1)
11     {
12         if(n==0)break;
13         for(i=0;i<n;i++)
14         scanf("%d",&price[i]);
15         scanf("%d",&m);
16         if(m<5)
17         {
18             printf("%d\n",m);
19             continue;
20         }
21         sort(price,price+n);
22         memset(dp,0,sizeof(dp));
23         for(i=0;i<n-1;i++)
24         for(v=m-5;v>=0;v--)
25         {
26             if(v-price[i]>=0&&dp[v-price[i]]+price[i]>dp[v])
27             dp[v]=dp[v-price[i]]+price[i];
28         }
29         printf("%d\n",m-price[n-1]-dp[m-5]);
30     }
31     return 0;
32 }
33                      

 

posted @ 2013-06-03 01:12  EtheGreat  阅读(173)  评论(0编辑  收藏  举报