0-1背包问题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[100][100];
 4 vector<int> select;
 5 int n;
 6 /**
 7 *填表格
 8 */
 9 int maxspace(int n, int bagspace, int space[], int values[]){
10     for(int i=0; i<=bagspace; i++){
11         if(i<space[0]) dp[0][i]=0;
12         else dp[0][i]=values[0];
13     }
14     for(int i = 1; i<n; i++){
15         for(int j = 0; j<=bagspace; j++){
16             if(j<space[i]) dp[i][j] = dp[i-1][j];//如果分配的空间不够用,那么最大值就是上次分配这些空间时的最大值
17             else dp[i][j] = max(values[i]+dp[i-1][j-space[i]], dp[i-1][j]);
18         }
19     }
20 }
21 /**
22 *回溯
23 */
24 void Select(int space[], int values[]){
25     int i = 4;
26     int j = 8;
27     while(i > -1){
28         if(dp[i][j] == values[i] + dp[i-1][j-space[i]]){//dp[i][j]的值为本件物品的价值加上所给剩余空间的可装物品最大值时,
29             select.push_back(i);                        //说明这个物品装在了包里
30             j = j - space[i];
31         }
32         i = i - 1;
33     }
34 }
35 
36 int main()
37 {
38     int space[100]={2,3,4,5};
39     int values[100]={3,4,5,6};
40     maxweight(4,8,space, values);
41     for(int i=0; i<4; i++){
42         for(int j=0; j<=8; j++)
43         {
44             cout<<dp[i][j]<<"	";
45         }
46         cout<<endl;
47     }
48     Select(space, values);
49     for(int i=0; i<select.size(); i++){
50         cout<<select[i]+1<<"	";
51     }
52 }
原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8824325.html