寒假打卡——AcWing426. 开心的金明

2021-02-01

426. 开心的金明

题意
很简单的01背包问题,只是价值变成了w[i]*v[i]
思路
定义f[i][j]为前i个物品中用体积为j的背包能装的物品的所有方案数
属性:最大值
状态转移

$$
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
可见 都是由前一维推导
$$

可见 都是由前一维推导得到的,所以只要保证前一维计算出来那么i-1可以省略,即从小到大枚举物品编号即可,而对于体积,要从大到小,因为如果从小到大会把前一维算出来的答案覆盖掉
Code

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int N,m;
        Scanner sc=new Scanner(System.in);
        N=sc.nextInt();
        m=sc.nextInt();
        int  []f=new int [200007];
        int []w=new int[200007];
        int []v=new int[200007];
        for(int i=1;i<=m;i++) {
            w[i]=sc.nextInt();
            v[i]=sc.nextInt();
        }

        for(int i=1;i<=m;i++) {
            for(int j=N;j>=w[i];j--) {
                f[j]=Math.max(f[j],f[j-w[i]]+v[i]*w[i]);
            }
        }
        System.out.println(f[N]);
    }
}
/*
12000 18
2758 5
3500 3
1200 2
430 4
530 3
239 3
2630 4
500 2
1120 3
1430 3
1420 5
400 1
1500 3
666 3
521 4
2430 3
1400 2
3410 4
 */

标题:寒假打卡——AcWing426. 开心的金明
作者:xiaob0
地址:https://xiaobo.net.cn/articles/2021/02/01/1612183537050.html