算法-动态规划-多重背包

0. 动态规划五部曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

img

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]);
    }
}
posted @   Frank23  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示