💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 1.问题描述
- 2.二维解决
- 3.一维优化
- 4.继续优化
1.问题描述
/*容量允许的情况下,可以重复拿同一个物品0 1 2 3 4 5 61 0 0 c c cc cc ccc 青铜 重22 0 0 c s cc sc ccc 白银 重33 0 0 c s a a ac 黄金 重4if(放得下) {dp[i][j] = max(dp[i-1][j], dp[i][j-item.weight] + item.value)} else {dp[i][j] = dp[i-1][j]}*/
2.二维解决
public class KnapsackProblemComplete {static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "青铜", 2, 3), // cnew Item(2, "白银", 3, 4), // snew Item(3, "黄金", 4, 7), // a};System.out.println(select(items, 6));}/*0 1 2 3 4 5 61 0 0 c c cc cc ccc2 0 0 c s cc cs ccc3 0 0 c s a a ac*/private static int select(Item[] items, int total) {int[][] dp = new int[items.length][total + 1];Item item0 = items[0];for (int j = 0; j < total + 1; j++) {if (j >= item0.weight) {dp[0][j] = dp[0][j - item0.weight] + item0.value;}}print(dp);for (int i = 1; i < items.length; i++) {Item item = items[i];for (int j = 1; j < total + 1; j++) {// x: 上一次同容量背包的最大价值int x = dp[i - 1][j];if (j >= item.weight) {// j-item.weight: 当前背包容量-这次物品重量=剩余背包空间// y: 剩余背包空间能装下的最大价值 + 这次物品价值int y = dp[i][j - item.weight] + item.value;dp[i][j] = Integer.max(x, y);} else {dp[i][j] = x;}}print(dp);}return dp[dp.length - 1][total];}static void print(int[][] dp) {System.out.println(" " + "-".repeat(63));Object[] array = IntStream.range(0, dp[0].length + 1).boxed().toArray();System.out.printf(("%5d ".repeat(dp[0].length)) + "%n", array);for (int[] d : dp) {array = Arrays.stream(d).boxed().toArray();System.out.printf(("%5d ".repeat(d.length)) + "%n", array);}}
}
3.一维优化
public class DP_05_KnapsackProblemComplete_04 {static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "青铜", 2, 3), // cnew Item(2, "白银", 3, 4), // snew Item(3, "黄金", 4, 7), // a};System.out.println(select(items, 6));}/*0 1 2 3 4 5 61 0 0 c c cc cc ccc 青铜 重22 0 0 c s cc sc ccc 白银 重33 0 0 c s a a ac 黄金 重4if(放得下) {dp[i][j] = max(dp[i-1][j], dp[i][j-item.weight] + item.value)} else {dp[i][j] = dp[i-1][j]}*/private static int select(Item[] items, int total) {int[] dp = new int[total + 1];for (int i = 0; i < items.length; i++) {final Item item = items[i];for (int j = 0; j < total + 1; j++) {if (j >= item.weight) {dp[j] = Integer.max(dp[j], dp[j - item.weight] + item.value);}}System.out.println(Arrays.toString(dp));}return dp[total];}
}
4.继续优化
public class DP_05_KnapsackProblemComplete_05 {static class Item {int index;String name;int weight;int value;public Item(int index, String name, int weight, int value) {this.index = index;this.name = name;this.weight = weight;this.value = value;}@Overridepublic String toString() {return "Item(" + name + ")";}}public static void main(String[] args) {Item[] items = new Item[]{new Item(1, "青铜", 2, 3), // cnew Item(2, "白银", 3, 4), // snew Item(3, "黄金", 4, 7), // a};System.out.println(select(items, 6));}private static int select(Item[] items, int total) {int[] dp = new int[total + 1];for (Item item : items) {for (int j = 0; j < total + 1; j++) {if (j >= item.weight) {dp[j] = Integer.max(dp[j], dp[j - item.weight] + item.value);}}System.out.println(Arrays.toString(dp));}return dp[total];}
}
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙