背包问题
面试可能
考的是0-1背包和完全背包问题。
概述
0-1背包
这里的动态规划是根据递归改的,dp[i][j]的含义是当查看到物品索引为i,剩余空间为j的时候,此时的最大价值。最后返回的是dp[0][20],也就是当从0索引开始的时候,背包容量为20的时候的值
package dynamic;
public class Knapsack {
// 递归方法主方法
public static int maxValue(int[] w,int[] v,int bag){
return process(w,v,0,bag);
}
/**
不变的量:w[] 所有货物重量数组 v[]价值数组 bag背包总重量
process函数 求的是index...往后的价值
0..index-1上做了货物的选择,使得你达到的重量是alreadyW
如果返回-1,认为没有方案
如果不返回-1,则认为返回的值是真实价值
*/
// 推荐的经典方法
public static int process(int[] w,int[] v,int index,int rest){
if (rest<0){ //case 1 剩余空间不足
return -1;
}
// rest > 0
// 货物已经遍历完
if (index == w.length){ // base case2
return 0;
}
// 有货也有空间
// 不添加当前index货物
int p1 = process(w,v,index+1,rest);
// 添加当前index货物
int p2 = -1;
int p2Next = process(w,v,index+1,rest-w[index]);
if (p2Next!=-1){
p2 = v[index]+p2Next;
}
return Math.max(p1,p2);
}
public static int dpWay(int[] w,int[] v,int bag){
int N = w.length;
int[][] dp = new int[N+1][bag+1];
// dp[N][...] = 0 最底下的一列初始值为0
for (int index = N-1; index >= 0; index--) {
for (int rest = 0; rest < bag; rest++) { // rest < 0
int p1 = dp[index+1][rest];
int p2 = -1;
if (rest-w[index]>=0){
p2 = v[index] + dp[index+1][rest-w[index]];
}
dp[index][rest] = Math.max(p1,p2);
}
}
return dp[0][bag];
}
}
参看:https://www.bilibili.com/video/BV1M44y1n78z?p=20&vd_source=46d50b5d646b50dcb2a208d3946b1598
10分钟
完全背包
参考:https://www.bilibili.com/video/BV1C7411K79w?p=2&vd_source=46d50b5d646b50dcb2a208d3946b1598
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)