0
点赞
收藏
分享

微信扫一扫

P1060 [NOIP2006 普及组] 开心的金明 java_ 01背包

8052cf60ff5c 2022-04-07 阅读 83
java

在这里插入图片描述
在这里插入图片描述

分析

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 此题每件物品的价值为:他的等级乘他的价钱;直接在输入时初始化;
  2. 一个记录每件商品的重量的数组weight,一个记录每件商品的价值数组valuue,以及dp[i][j] 表示从下标为[1-i]的物品⾥任意取,放进容量
    为j的背包,价值总和最⼤是多少
  3. 递推公式:
    3.1 如果当前背包容量不够装:dp[i][j] = dp[i - 1][j];
    3.2 够装: dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
import java.util.Scanner;

//1:无需package
//2: 类名必须Main, 不可修改
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//总钱数(背包容量)
        int m = sc.nextInt();//希望购买物品的个数(物品数目)
        int[] value = new int[30];//每件物品的价值
        int[] weight = new int[30];//每件物品所占背包容量
        int[][] dp = new int[30][30005];
        for (int i = 1; i <= m; i++) {
            weight[i] = sc.nextInt();//该件商品需要的钱
            value[i] = sc.nextInt() * weight[i];//该件商品的价值
        }
        for (int i = 1; i <= m; i++) {//物品个数
            for (int j = 1; j <= n; j++) {//背包容量
                if (weight[i] > j)
                    dp[i][j] = dp[i - 1][j];
                else
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);//选第i件商品或者不选
            }
        }
        System.out.println(dp[m][n]);
    }
}





举报

相关推荐

0 条评论