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