【01背包问题】
思路:
维持一个数组arr[i][j],表示前i个物品中的若干个,放入体积为j的背包中的最大价值。
每次放入第i个物品,就更新这个数组
动态规划递推关系式:
if (j < vol[i]) //当前物品的体积比当前背包体积大,放不进背包
arr[i][j] = arr[i – 1][j];
else //放得进背包,逐一比较不放物品i与放物品i(背包体积为j-vol[j])的价值大小
arr[i][j] = max(arr[i – 1][j], arr[i – 1][j – vol[i]] + cost[i]);
空间优化:arr[i][]只与arr[i-1][]有关,只需一个一维数组
- 1 int main()
- 2 {
- 3 int cost[6] = { 0,2,5,3,10,4 }; //5件物品的价值
- 4 int vol[6] = { 0,1,3,2,6,2 }; //5件物品的体积
- 5 int bagV = 12; //背包体积
- 6 while (cin >> bagV)
- 7 {
- 8 vector<vector<int>> arr(6, vector<int>(bagV + 1, 0)); //arr[6][bagV+1]数组初始化
- 9 for (int i = 1;i < sizeof(cost) / sizeof(int);i++)
- 10 {
- 11 for (int j = 1;j <= bagV;j++)
- 12 {
- 13 if (j < vol[i]) //当前物品的体积比当前背包体积大,放不进背包
- 14 arr[i][j] = arr[i - 1][j];
- 15 else //放得进背包,逐一比较不放物品i与放物品i(背包体积为j-vol[j])的价值大小
- 16 arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - vol[i]] + cost[i]);
- 17 cout << arr[i][j] << \' \';
- 18 }
- 19 cout << endl;
- 20 }
- 21 cout << arr[5][bagV] << endl;
- 22 }
- 23 return 0;
- 24 }