饭卡

hdu2546:http://acm.hdu.edu.cn/showproblem.php?pid=2546

题意:给你N元,每一件食品可以购买一次,如果卡上多余5元即使透支也可以刷卡。少于5元不能使用,求最多能让卡的余额为多少?
题解:01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了。

 1 #include <cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #define N 1003
 7 using namespace std;
 8 int v[N],dp[N],n,k;
 9 int main(void){
10 while (~scanf("%d",&n)&&n){
11     memset(dp,0,sizeof(dp));
12    for (int i=0;i<n;i++)
13       scanf("%d",&v[i]);
14     sort(v,v+n);//排序找出最贵的菜 
15     scanf("%d",&k);
16   if(k<5){printf("%d
",k);continue;}
17     else{
18       k-=5;
19    for (int i=0;i<n-1;i++)//转化成0-1背包 
20    for (int j=k;j>=v[i];j--)
21      if (dp[j-v[i]]+v[i]> dp[j])
22        dp[j]=dp[j-v[i]]+v[i];
23      printf("%d
",k+5-dp[k]-v[n-1]);
24         
25     } 
26   }
27   return 0;
28 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3401687.html