zoukankan      html  css  js  c++  java
  • hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191

    思路分析:该问题为多重背包问题;假设状态dp[i][v]表示在前i件物品中选择物品放入大小为v的背包的最大的重量,则可以第i件物品可以选择0~n[i]件,所以可以得出状态方程 dp[i][v] = Max{dp[i-1][v – k * c[i]] + k * w[i]}, 0 <= k <= n[i];

    代码如下:

    import java.util.*;
    
    public class Main {
        static int MAX_N = 100 + 10;
        static int[] c = new int[MAX_N];
        static int[] w = new int[MAX_N];
        static int[] n = new int[MAX_N];
        static int[][] dp = new int[MAX_N][MAX_N];
        
        public static int Max(int a, int b) {
            return a > b ? a : b;
        }
        public static void main(String[] args) {
            int case_times;
            Scanner in = new Scanner(System.in);
            
            case_times = in.nextInt();
            while (case_times-- != 0) {
                int V, M;
                
                V = in.nextInt();
                M = in.nextInt();
                for (int i = 1; i <= M; ++ i) {
                    c[i] = in.nextInt();
                    w[i] = in.nextInt();
                    n[i] = in.nextInt();
                }
                for (int i = 0; i < MAX_N; ++ i)
                    for (int j = 0; j < MAX_N; ++ j)
                        dp[i][j] = 0;
                for (int i = 1; i <= M; ++ i) {
                    for (int v = 0; v <= V; ++ v) {
                        for (int k = 0; k <= n[i]; ++ k)
                            if (v - k * c[i] >= 0)
                                dp[i][v] = Max(dp[i][v], dp[i-1][v - k * c[i]] + k * w[i]);
                    }
                }
                System.out.println(dp[M][V]);
            }
        }
    }
  • 相关阅读:
    01.Markdown学习
    微信小程序开发基础
    如何在本地搭建微信小程序服务器
    Golang | 报错
    Golang | 扩展
    Golang | 基础
    Golang | 基础
    Golang | 基础
    Chrome——书签同步码云
    Rustlings_structs
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4691700.html
Copyright © 2011-2022 走看看