刷题45-固定体积的最大价值(背包问题)

原题链接

扩展题目一------考试答题

扩展题目二------资产打包

题目描述

第1行有2个整数,物品种数n和背包装载体积v;
第2行到i+1行每行3个整数,为第i种物品的数量m、体积w、价值s。

示例

输入:
2 10
3 4 3
2 2 5
输出:
13

参考解法

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    
    
    private static class Good {
    
    
    	// 体积
        int w;
        // 价值
        int s;
        public Good(int w, int s) {
    
    
            this.w = w;
            this.s = s;
        }
    }
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        // 种类
        int n = scanner.nextInt();
        // 总体积
        int v = scanner.nextInt();
        List<Good> goods = new ArrayList<>();
        for (int i = 0; i < n; i++) {
    
    
        	// 数量
            int m = scanner.nextInt(), 
            // 体积
            int w = scanner.nextInt(), 
            // 价值
            int s = scanner.nextInt();
            for (int j = 0; j < m; j++) {
    
    
                goods.add(new Good(w, s));
            }
        }
        System.out.println(solve(goods, v));
    }
    private static int solve(List<Good> goods, int v) {
    
    
    	// dp[i]表示体积为i时的最大价值
        int[] dp = new int[v + 1];
        for (int i = 0; i < goods.size(); i++) {
    
    
            Good good = goods.get(i);
            for (int j = v; j >= 1; j--) {
    
    
                if (j >= good.w) {
    
    
                    dp[j] = Math.max(dp[j], dp[j - good.w] + good.s);
                }
            }
        }
        return dp[v];
    }
}

简化版

import java.util.*;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int v = in.nextInt();
        int[] dp = new int[v+1];
        for(int i = 0; i < n; i++) {
    
    
            int n1 = in.nextInt();
            int n2 = in.nextInt();
            int n3 = in.nextInt();
            for(int j = 0; j < n1; j++) {
    
    
                for(int k = v; k >= 1; k--) {
    
    
                    if(k >= n2) {
    
    
                        dp[k] = Math.max(dp[k], dp[k-n2] + n3);
                    }
                }
            }
        }
        System.out.println(dp[v]);
    }
}

猜你喜欢

转载自blog.csdn.net/Awt_FuDongLai/article/details/111405458
今日推荐