| 有一个背包,容量为4磅,现在将如下商品装入背包,要求装入的背包的总价值最大,并且重量不超出,且物品不能重复 |
| |
| |
| |

-
简介

-
思路分析
| 每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。 |
| 即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,C为背包的容量。 |
| 再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。则我们有下面的结果: |
| (1) v[i][0]=v[0][j]=0; |
| (2) 当w[i]> j 时:v[i][j]=v[i-1][j] |
| (3) 当j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]} |
| |
| |
| v[i-1][j]: 就是上一个单元格的装入的最大值 |
| v[i] : 表示当前商品的价值 |
| v[i-1][j-w[i]] : 装入i-1商品,到剩余空间j-w[i]的最大值 |
| 当j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]} |
| |
| 红色箭头指向 表示背包的容量 |
| 绿色箭头指向 表示当前拥有的物品 |

| public class KnapsackProblem { |
| |
| public static void main(String[] args) { |
| int[] w = {1, 4, 3}; |
| int[] val = {1500, 3000, 2000}; |
| int m = 4; |
| int n = val.length; |
| |
| |
| |
| int[][] v = new int[n+1][m+1]; |
| |
| int[][] path = new int[n+1][m+1]; |
| |
| |
| for(int i = 0; i < v.length; i++) { |
| v[i][0] = 0; |
| } |
| for(int i=0; i < v[0].length; i++) { |
| v[0][i] = 0; |
| } |
| |
| |
| for(int i = 1; i < v.length; i++) { |
| for(int j=1; j < v[0].length; j++) { |
| |
| if(w[i-1]> j) { |
| v[i][j]=v[i-1][j]; |
| } else { |
| |
| |
| |
| |
| |
| if(v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) { |
| v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]]; |
| |
| path[i][j] = 1; |
| } else { |
| v[i][j] = v[i - 1][j]; |
| } |
| |
| } |
| } |
| } |
| |
| |
| for(int i =0; i < v.length;i++) { |
| for(int j = 0; j < v[i].length;j++) { |
| System.out.print(v[i][j] + " "); |
| } |
| System.out.println(); |
| } |
| |
| |
| int i = path.length - 1; |
| int j = path[0].length - 1; |
| while(i > 0 && j > 0 ) { |
| if(path[i][j] == 1) { |
| System.out.printf("第%d个商品放入到背包\n", i); |
| j -= w[i-1]; |
| } |
| i--; |
| } |
| |
| } |
| |
| } |
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术