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]<<"\t";
45 }
46 cout<<endl;
47 }
48 Select(space, values);
49 for(int i=0; i<select.size(); i++){
50 cout<<select[i]+1<<"\t";
51 }
52 }