原题链接: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                      

 

相关文章:

  • 2021-10-13
  • 2021-07-23
  • 2021-10-31
  • 2021-12-07
  • 2021-09-04
  • 2021-07-26
  • 2022-02-04
  • 2021-09-28
猜你喜欢
  • 2021-10-06
  • 2021-12-29
  • 2022-01-20
  • 2022-02-22
  • 2021-06-16
  • 2021-09-12
  • 2021-12-06
相关资源
相似解决方案