赞
踩
用动态规划算法编程实现0-1背包问题
现有4件物品需要放入背包中;物品的重量分别为2,3,4,7;物品的价格分别对应为1,3,5,9;背包所能承受的最大重量为10。需要通过算法实现将物品放入背包中且实现背包中的价值和最大。
将已知的数据进行整理,并定义一些即将用到的数据
如果 j >WeightV[3][1]:m[ i ][ j ]=WeightV[3][2];
(2)m[ i+1 ][ j ] !=0 分类:
m[i3+ 1][j - WeightV[3][2]] + WeightV[3][2] <= m[3 + 1][j]
m[i3+ 1][j - WeightV[3][2]] + WeightV[3][2] >= m[3 + 1][j]
物品3无此类情况发生
依次对物品进行分析,得到最终图:
void Bag() { int i = 0, j = 0; //对第n行进行判断并赋值 for (j = 0; j <= cw; j++) { if (j < WeightV[n][1]) { m[n][j] = 0; } else { m[n][j] = WeightV[n][2]; } } //对第1-(n-1)行进行判断并赋值 for (i = n - 1; i >= 1; i--) { for (j = 0; j <= cw; j++) { if (m[i + 1][j] == 0) { if (j < WeightV[i][1])//背包装不下该物品 { m[i][j] = 0; } else if (j >= WeightV[i][1])//直接装下该物品 { m[i][j] = WeightV[i][2]; } } else //背包能装下,需要进行进一步判断是否值得装下 { if (m[i + 1][j - WeightV[i][2]] + WeightV[i][2] <= m[i + 1][j]) { m[i][j] = m[i + 1][j]; } else { m[i][j] = m[i + 1][j] + WeightV[i][2]; } } } } } void output() { int i = 0, j = 0; outfile << "最终形成的m[i][j]如图所示:" << endl; for (i = 1; i <= n; i++) { for (j = 0; j <= cw; j++) { outfile << setw(3) << m[i][j]; } outfile << endl; } int t = 1; //找装包完成后的最大价值和 for (j = 0; j <= cw; j++) { if (m[1][j] > p) { p = m[1][j]; t = j; } } //查找取得最大价值和的物品组合 outfile << "装入背包的物品价值最大和为:" << p << endl; outfile << " 装入的物品组合为:" << endl; if (m[n][t] != 0) outfile << setw(3) << n; for (i = n - 1; i >= 1; i--) { if (m[i][t] == m[i + 1][t]); else if (m[i][t] != m[i + 1][t]) outfile << setw(3) << i; } }
输入样例:
4 10
2 1
3 3
4 5
7 9
输出样例:
请输入:n(物品数量)、cw(背包限重)
请输入各个物品对应的重量、价格
最终形成的m[i][j]如图所示:
0 0 1 3 5 6 6 9 10 10 12
0 0 0 3 5 5 5 9 9 9 12
0 0 0 0 5 5 5 9 9 9 9
0 0 0 0 0 0 0 9 9 9 9
装入背包的物品价值最大和为:12
装入的物品组合为:
4 2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。