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 }