背包详解

博客链接:http://www.cnblogs.com/tanky_woo/archive/2010/07/31/1789621.html

 

01背包:

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2602

 

代码:

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const ll LINF = (1LL<<60);
23 const double eps = 1e-8;
24 const double PIE=acos(-1.0);
25 const int d1x[]= {0,-1,0,1};
26 const int d1y[]= {-1,0,1,0};
27 const int d2x[]= {0,-1,0,1};
28 const int d2y[]= {1,0,-1,0};
29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
31 inline int min_32(int (a),int (b))
32 {
33     return (a)<(b)?(a):(b);
34 }
35 inline int max_32(int (a),int (b))
36 {
37     return (a)>(b)?(a):(b);
38 }
39 inline long long min_64(long long (a),long long (b))
40 {
41     return (a)<(b)?(a):(b);
42 }
43 inline long long max_64(long long (a),long long (b))
44 {
45     return (a)>(b)?(a):(b);
46 }
47 /***************************************/
48 void openfile()
49 {
50     freopen("data.in","rb",stdin);
51     freopen("data.out","wb",stdout);
52 }
53 /**********************华丽丽的分割线,以上为模板部分*****************/
54 int weight[1001],val[1001];
55 int dp[1001];
56 int main()
57 {
58     int cas;
59     scanf("%d",&cas);
60     while(cas--)
61     {
62         memset(dp,0,sizeof(dp));
63         memset(weight,0,sizeof(weight));
64         memset(val,0,sizeof(val));
65         int nPack,maxVal;
66         int i,j;
67         scanf("%d%d",&nPack,&maxVal);
68         for(i=0;i<nPack;i++)
69         {
70             scanf("%d",&val[i]);
71         }
72         for(i=0;i<nPack;i++)
73         {
74             scanf("%d",&weight[i]);
75         }
76         for(i=0;i<nPack;i++)
77             for(j=maxVal;j>=weight[i];j--)
78             {
79                 if (dp[j-weight[i]]+val[i]>dp[j])
80                     dp[j]=dp[j-weight[i]]+val[i];
81             }
82         printf("%d\n",dp[maxVal]);
83     }
84     return 0;
85 }
View Code

 

完全背包:

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1114

 

代码:

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const ll LINF = (1LL<<60);
23 const double eps = 1e-8;
24 const double PIE=acos(-1.0);
25 const int d1x[]= {0,-1,0,1};
26 const int d1y[]= {-1,0,1,0};
27 const int d2x[]= {0,-1,0,1};
28 const int d2y[]= {1,0,-1,0};
29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
31 inline int min_32(int (a),int (b))
32 {
33     return (a)<(b)?(a):(b);
34 }
35 inline int max_32(int (a),int (b))
36 {
37     return (a)>(b)?(a):(b);
38 }
39 inline long long min_64(long long (a),long long (b))
40 {
41     return (a)<(b)?(a):(b);
42 }
43 inline long long max_64(long long (a),long long (b))
44 {
45     return (a)>(b)?(a):(b);
46 }
47 /***************************************/
48 void openfile()
49 {
50     freopen("data.in","rb",stdin);
51     freopen("data.out","wb",stdout);
52 }
53 /**********************华丽丽的分割线,以上为模板部分*****************/
54 int weight[10001],val[50001];
55 int dp[10001];
56 int main()
57 {
58     int cas;
59     scanf("%d",&cas);
60     while(cas--)
61     {
62         memset(dp,0,sizeof(dp));
63         memset(weight,0,sizeof(weight));
64         memset(val,0,sizeof(val));
65         int nPack,Val;
66         int i,j;
67         int Eval,Pval;
68         scanf("%d%d",&Eval,&Pval);
69         Val=Pval-Eval;
70         scanf("%d",&nPack);
71         for(i=0;i<nPack;i++)
72         {
73             scanf("%d%d",&val[i],&weight[i]);
74         }
75         for(i=0;i<=Val;i++)
76             dp[i]=INF;
77         dp[0]=0;
78         for(i=0;i<nPack;i++)
79             for(j=weight[i];j<=Val;j++)
80             {
81                 if (dp[j-weight[i]]+val[i]<dp[j])
82                     dp[j]=dp[j-weight[i]]+val[i];
83             }
84         if (dp[Val]==INF)
85             printf("This is impossible.\n");
86         else
87             printf("The minimum amount of money in the piggy-bank is %d.\n",dp[Val]);
88     }
89     return 0;
90 }
View Code

 

多重背包:

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2191

 

代码:

 

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const ll LINF = (1LL<<60);
23 const double eps = 1e-8;
24 const double PIE=acos(-1.0);
25 const int d1x[]= {0,-1,0,1};
26 const int d1y[]= {-1,0,1,0};
27 const int d2x[]= {0,-1,0,1};
28 const int d2y[]= {1,0,-1,0};
29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
31 inline int min_32(int (a),int (b))
32 {
33     return (a)<(b)?(a):(b);
34 }
35 inline int max_32(int (a),int (b))
36 {
37     return (a)>(b)?(a):(b);
38 }
39 inline long long min_64(long long (a),long long (b))
40 {
41     return (a)<(b)?(a):(b);
42 }
43 inline long long max_64(long long (a),long long (b))
44 {
45     return (a)>(b)?(a):(b);
46 }
47 /***************************************/
48 void openfile()
49 {
50     freopen("data.in","rb",stdin);
51     freopen("data.out","wb",stdout);
52 }
53 /**********************华丽丽的分割线,以上为模板部分*****************/
54 int weight[105],val[105],num[105];
55 int dp[105];
56 int main()
57 {
58     int cas;
59     scanf("%d",&cas);
60     while(cas--)
61     {
62         memset(dp,0,sizeof(dp));
63         memset(weight,0,sizeof(weight));
64         memset(val,0,sizeof(val));
65         memset(num,0,sizeof(num));
66         int nPack,Val;
67         int i,j,k;
68         scanf("%d%d",&Val,&nPack);
69         for(i=0;i<nPack;i++)
70         {
71             scanf("%d%d%d",&weight[i],&val[i],&num[i]);
72         }
73         for(i=0;i<nPack;i++)
74             for(k=0;k<num[i];k++)
75                 for(j=Val;j>=weight[i];j--)
76                     if(dp[j-weight[i]]+val[i]>dp[j])
77                         dp[j]=dp[j-weight[i]]+val[i];
78         printf("%d\n",dp[Val]);
79     }
80     return 0;
81 }
82 
83 /*
84 
85 1
86 8 2
87 2 100 4
88 4 100 2
89 \
90 
91 1
92 10 2
93 2 100 4
94 4 100 2
95 
96 */
View Code

 

posted @ 2014-12-18 21:21  kinghold  Views(203)  Comments(0Edit  收藏  举报