代码:
#include<iostream> using namespace std; struct bag { int weight; //包的重量 int value; //包的价值 }arr[100]; int option[100]; //用于保存满足的最大值方案 int cop[100]; //用于标识每个包是否被选取 int maxv, limitw, totv; int n; void find(int i, int tw, tv) { int k; if(tw + arr[i].weight <= limitw) //该包被选取 { cop[i] = 1; //设立标记 if(i < n - 1) { find(i + 1, tw + arr[i].weight, tv); //递归判断下一个包 } else { for(k = 0; k < n; k++) { option[k] = cop[k]; //保存包被选取的信息 } maxv = tv; //获取最大价值 } cop[i] = 0; //还原cop数组 } if(tv - arr[i].value > maxv) //该包没有被选取,判断该方案的价值是否最大。如果不是,继续寻找下一个包 { if(i < n - 1) { find(i + 1, tw, tv - arr[i].value); } else { for(k = 0; k < n; k++) { option[k] = cop[k]; //保存包被选取的信息 } maxv = tv - arr[i].value; //获取最大价值 } } } int main() { int k, w, v; cout << "please input count:"; cin >> n; totv = 0; for( k = 0; k < n; k++) { cout << "please input the weight and val" << endl; cin >> arr[k].weight; cin>> arr[k].value; } cout << "please input limitw:"; cin >> limitw; maxv = 0; for(k = 0; k < n; k++) { cop[k] = 0; } find(0, 0, totv); cout << "the result is:"; for(k = 0; k < n; k++) { if(option[k]) { cout << k + 1 << " "; } } cout << endl; cout << "the total value is:" << maxv << endl; return 0; }