思路
1.定义dp数组
dp[j]:表示为背包容量为j时的最大价值。
2.递推公式
当weight[i]的重量比当前背包的容量小时,说明当前背包可以将物品i放入进来,此时dp[j]=dp[j-物品i的重量]+物品i的价值。此时也可以选择不放进来,则dp[j] = dp[j]。最后dp[j]为二者中最大的。
3.dp数组初始化
dp[0]就是背包容量为0时的价值。应该为0;
4.遍历顺序
倒序遍历是为了保证物品i只被放入一次!如果正序遍历的话,在计算dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i])时,就会将前一个物品再次放入。当j=1时,dp[1] = 15;当j=2时,dp[2] = 30,即将物品1重复计算
5.打印顺序
最后的结果就是在数组的最后一个元素。
代码
public void Test01bag(){
int[] weight = {1, 3, 4};
int[] value = {15, 20, 30};
int bagsize = 4;
int dp[] = new int[bagsize+1];
dp[0] = 0;
for (int i = 0;i<weight.length;i++){
for (int j = bagsize;j>=weight[i];j--]){
dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i]);
}
}
//打印dp数组
for (int j = 0; j <= bagsize; j++){
System.out.print(dp[j] + " ");
}
}
本文详细介绍了如何使用动态规划解决一维01背包问题,包括dp数组定义、递推公式、初始化、遍历顺序及打印结果的具体实现过程。
&spm=1001.2101.3001.5002&articleId=123745548&d=1&t=3&u=6d206d877ac34d288297fb050d063bca)
459

被折叠的 条评论
为什么被折叠?



