unity异步加载

C语言编程:已知二叉树前序和中序,如何求出后序遍历?

  返回  

背包题目汇总

2021/8/20 16:59:58 浏览:

二、完全背包

leecode322 零钱兑换

package zsh;

import java.util.Arrays;

public class UnboundedKnapsack {
    public static void main(String[] args) {
        int[] coins = {2, 5};
        int amount = 11;
        int[] dp = new int[amount+1];
        Arrays.fill(dp, 0x3f3f3f3f);  //设成Integer.MAX_VALUE会使下面dp[j - coins[i]] + 1溢出
        dp[0] = 0;
        for (int i = 0; i < coins.length; i++) {
//            for (int j = coins[i]; j <= amount ; j += coins[i]) {  //注意此处不能为j += coins[i],会略去很多中间态,使结果错误
            for (int j = coins[i]; j <= amount ; j++) {
                dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
            }
        }
        System.out.println(dp[amount] == 0x3f3f3f3f ? -1 : dp[amount]);
    }
}

三、多重背包

第一行 可使用钱总额N 零食种类N

第2~N+1行 零食价格 数量 喜爱程度

问:选取X元零食可达到最大喜爱度

6 7
3 1 8
4 1 2
3 1 1
9 1 7
4 1 1
5 1 18
4 1 4

输出 18

6 7
3 1 8
4 1 2
3 1 1
9 1 7
4 1 1
4 1 8
4 1 4

输出 9

package zsh;

import java.util.Scanner;

public class BoundedKnapsack {  //多重背包
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int amount = scanner.nextInt();  //总金额 //背包重量
        int snackTypes = scanner.nextInt();  //零食种类  //物品种类
        int[] price = new int[snackTypes];  //零食价格  //物品重量
        int[] num = new int[snackTypes];  //零食数量  //物品数量
        int[] degree = new int[snackTypes];  //喜爱程度  //物品价格
        for (int i = 0; i < snackTypes; i++) {
            price[i] = scanner.nextInt();
            num[i] = scanner.nextInt();
            degree[i] = scanner.nextInt();
        }
        int[] dp = new int[amount+1];
        for (int i = 0; i < snackTypes; i++) {
//            for (int j = amount; j > 0; j -= price[i]) {  //注意此处不能为j -= price[i],会略去很多中间态,使结果错误
            for (int j = amount; j > 0; j--) {
                int min = Math.min(j/price[i], num[i]);
                for (int k = 1; k <= min; k++) {
                    dp[j] = Math.max(dp[j], dp[j - k * price[i]] + k * degree[i]);
                }
            }
        }
        System.out.println(dp[amount]);
    }
}


//反例
//5 2
//2 3 4
//3 4 5

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号