完全背包
一个背包总容量为V,现在有N个物品,第i个 物品体积为weight[i],价值为value[i],每个物品都有无限多件,现在往背包里面装东西,怎么装能使背包的内物品价值最大?
思路
从第一种物品开始,容量递增,来计算最大价值。第n种物品,则是将当前容量对应已有最大的价值和放入后的价值比较,取最大的。
完全背包的状态转移方程
if (oneWeight[i] <= j) {
dp[j] = Math.max(dp[j], dp[j - oneWeight[i]] + oneValue[i]);
}
代码
/**
* @Description
* @Author xujz
* @Date 2020/4/9 11:00
* @param n 物品类数
* @param w 背包重量
* @return
* @exception
*
*/
public static int great(int n, int w) {
Scanner scanner = new Scanner(System.in);
int[] dp = new int[w + 1];
int[] oneWeight = new int[n + 1];
int[] oneValue = new int[n + 1];
for (int i = 1; i <= n; i++) {
oneWeight[i] = scanner.nextInt();
oneValue[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= w; j++) {
if (oneWeight[i] <= j) {
dp[j] = Math.max(dp[j], dp[j - oneWeight[i]] + oneValue[i]);
System.out.print(dp[j] + " ");
}
}
System.out.println();
}
return 0;
}