算法-动态规划-多重背包
0. 动态规划五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
1. 多重背包问题
多重背包指的是每个物品最多可以选取num[i]
次
将每个物品展开,多重背包问题就可以转化为01背包问题。
import java.util.Scanner;
public class Main{
// 多重背包可以转化为01背包问题
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int bagWeight = scanner.nextInt();
int n = scanner.nextInt();
int[] weight = new int[n];
int[] value = new int[n];
int[] num = new int[n];
for(int i = 0; i<n; ++i) weight[i] = scanner.nextInt();
for(int i = 0; i<n; ++i) value[i] = scanner.nextInt();
for(int i = 0; i<n; ++i) num[i] = scanner.nextInt();
int[] dp = new int[bagWeight+1];
for(int i = 0; i<n; ++i) {
// 对于每一种物品,循环k次
for(int k = 1; k<=num[i]; ++k) {
for(int j = bagWeight; j>=weight[i]; --j) {
dp[j] = Math.max(dp[j], dp[j-weight[i]]+value[i]);
}
}
}
System.out.println(dp[bagWeight]);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律