hdoj 2546 饭卡

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546

解题思路:贪心+01背包

  1 ///////////////////////////////////////////////////////////////////////////
  2 //problem_id: hdoj 2546
  3 //user_id: SCNU20102200088
  4 ///////////////////////////////////////////////////////////////////////////
  5 
  6 #include <algorithm>
  7 #include <iostream>
  8 #include <iterator>
  9 #include <iomanip>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <string>
 13 #include <vector>
 14 #include <cstdio>
 15 #include <cctype>
 16 #include <cmath>
 17 #include <queue>
 18 #include <stack>
 19 #include <list>
 20 #include <set>
 21 #include <map>
 22 using namespace std;
 23 
 24 ///////////////////////////////////////////////////////////////////////////
 25 #pragma comment(linker,"/STACK:1024000000,1024000000")
 26 
 27 #define lson l,m,rt<<1
 28 #define rson m+1,r,rt<<1|1
 29 ///////////////////////////////////////////////////////////////////////////
 30 
 31 ///////////////////////////////////////////////////////////////////////////
 32 const double EPS=1e-8;
 33 const double PI=acos(-1.0);
 34 
 35 const int x4[]={-1,0,1,0};
 36 const int y4[]={0,1,0,-1};
 37 const int x8[]={-1,-1,0,1,1,1,0,-1};
 38 const int y8[]={0,1,1,1,0,-1,-1,-1};
 39 ///////////////////////////////////////////////////////////////////////////
 40 
 41 ///////////////////////////////////////////////////////////////////////////
 42 typedef long long LL;
 43 
 44 typedef int T;
 45 T max(T a,T b){ return a>b? a:b; }
 46 T min(T a,T b){ return a<b? a:b; }
 47 T gcd(T a,T b){ return b==0? a:gcd(b,a%b); }
 48 T lcm(T a,T b){ return a/gcd(a,b)*b; }
 49 ///////////////////////////////////////////////////////////////////////////
 50 
 51 ///////////////////////////////////////////////////////////////////////////
 52 //Add Code:
 53 ///////////////////////////////////////////////////////////////////////////
 54 
 55 int main(){
 56     ///////////////////////////////////////////////////////////////////////
 57     //Add Code:
 58     int n,m,i,j,a[1005],dp[1005];
 59     while(scanf("%d",&n)!=EOF){
 60         if(n==0) break;
 61         for(i=1;i<=n;i++){
 62             scanf("%d",&a[i]);
 63             if(i>1 && a[i]<a[i-1]){
 64                 int temp=a[i-1];
 65                 a[i-1]=a[i];
 66                 a[i]=temp;
 67             }
 68         }
 69         scanf("%d",&m);
 70         if(m<5){
 71             printf("%d
",m);
 72             continue;
 73         }
 74         for(i=0;i<=m-5;i++) dp[i]=0;
 75         for(i=1;i<=n-1;i++){
 76             for(j=m-5;j>=a[i];j--){
 77                 dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
 78             }
 79         }
 80         printf("%d
",m-dp[m-5]-a[n]);
 81     }
 82     ///////////////////////////////////////////////////////////////////////
 83     return 0;
 84 }
 85 
 86 ///////////////////////////////////////////////////////////////////////////
 87 /*
 88 Testcase:
 89 Input:
 90 1
 91 50
 92 5
 93 10
 94 1 2 3 2 1 1 2 3 2 1
 95 50
 96 0
 97 Output:
 98 -45
 99 32
100 */
101 ///////////////////////////////////////////////////////////////////////////
原文地址:https://www.cnblogs.com/linqiuwei/p/3320630.html