经典问题,物品个数为n,背包重量为v,则时间复杂度为O(nv)。
空间复杂度为O(v)。
不过如果要得到选择的最终结果,则需要把中间结果都记录下来,空间复杂度只能也用O(nv)。
#include <iostream> using namespace std; int max(int a,int b) { return a>=b ? a : b; } int bag_use_one_array ( const int weight[], const int value[], const int item_size, const int bag_weight) { int max_value[bag_weight+1]; for (int i=0; i<=bag_weight; i++) { max_value[i] = 0; } for (int i=0; i<item_size; i++) { for (int w=bag_weight; w>=1; w--) { if (weight[i] <= w) { //max_value[w] = max(max_value[w], max_value[w-weight[i]]+value[i]); if ( max_value[w] >= max_value[w-weight[i]]+value[i]) { } else { max_value[w] = max_value[w-weight[i]]+value[i]; } cout << "item:" << i << ",wight:" << w << ",max_value:" << max_value[w] << endl; } } cout << endl; } cout << "max value is : " << max_value[bag_weight] << endl; cout << endl; return max_value[bag_weight]; } int bag_get_best_choice ( const int weight[], const int value[], const int item_size, const int bag_weight) { int max_value[bag_weight+1][item_size+1]; for (int i=0; i<=bag_weight; i++) { max_value[i][0] = 0; } for (int j=0; j<=item_size; j++) { max_value[0][j] = 0; } for (int i=1; i<=item_size; i++) { for (int w=bag_weight; w>=1; w--) { if (weight[i-1] <= w) { if ( max_value[w][i-1] >= max_value[w-weight[i-1]][i-1]+value[i-1]) { max_value[w][i] = max_value[w][i-1]; } else { max_value[w][i] = max_value[w-weight[i-1]][i-1]+value[i-1]; } } else { max_value[w][i] = max_value[w][i-1]; } cout << "item:" << i << ",wight:" << w << ",max_value:" << max_value[w][i] << endl; } cout << endl; } cout << "max value is : " << max_value[bag_weight][item_size] << endl; cout << endl; int choice[item_size]; int weight_choice = bag_weight; for (int i=item_size-1; i>=0; i--) { if (max_value[weight_choice][i+1] > max_value[weight_choice][i]) { choice[i]=1; weight_choice -= weight[i]; } else { choice[i]=0; } } for (int i=0; i<item_size; i++) { cout << choice[i] << " "; } cout << endl; return max_value[bag_weight][item_size]; } int main() { const int item_size = 5; const int bag_weight = 15; int weight[item_size] = {12,1,4,1,2}; int value[item_size] = {4,2,10,1,2}; //bag_use_one_array(weight, value, item_size, bag_weight); bag_get_best_choice(weight, value, item_size, bag_weight); return 0; }
本文出自 “天眼神童的新家” 博客,请务必保留此出处http://tianyanshentong.blog.51cto.com/3356396/1556397
原文地址:http://tianyanshentong.blog.51cto.com/3356396/1556397