是要将0-1背包问题动态规划后,回溯找出放在背包里的物品java
一开始代码是这样数组
for (int i=n, j=m ;i>0;i--){ while (arr[i][j]==arr[i-1][j]){ i--; } if ( arr[i][j]==arr[i-1][j-weight[i-1]]+value[i-1]){ System.out.println("背包内存放第"+i+"号物品"); j = j-weight[i-1]; } }
以后报错数组越界 -1,想了下发现是没有添加 判断i>0,因而改为了spa
for (int i=n, j=m ;i>0;i--){ while (arr[i][j]==arr[i-1][j]&&i>0){ i--; } if ( arr[i][j]==arr[i-1][j-weight[i-1]]+value[i-1]&&i>0){ System.out.println("背包内存放第"+i+"号物品"); j = j-weight[i-1]; } }
此时提示code
最后明白了 在第一步blog
arr[i][j]==arr[i-1][j]时,若是i=0时 就已经错,后面的i>0没有起到检验的做用,因此要把i>0添加到前面,即内存
for (int i=n, j=m ;i>0;i--){ while (i > 0 &&arr[i][j]==arr[i-1][j]){ i--; } if (i > 0 && arr[i][j]==arr[i-1][j-weight[i-1]]+value[i-1]){ System.out.println("背包内存放第"+i+"号物品"); j = j-weight[i-1]; } }