题解 | #黄金瞳#

黄金瞳

http://www.nowcoder.com/questionTerminal/ab81723396c94ea398167472a134399f

背包问题,话不多说看代码

import java.util.concurrent.ConcurrentHashMap;

public class Main {
        public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int i = scanner.nextInt();

        int num = scanner.nextInt();

        int[] a1 = new int[num+1];
        int[] a2 = new int[num+1];
        int[] a3 = new int[num+1];

        for (int i1 = 1; i1 < a1.length; i1++) {


            if (scanner.hasNext()) {
                a1[i1] = scanner.nextInt();
            }

        }
        for (int i1 = 1; i1 < a2.length; i1++) {
            if (scanner.hasNext()) {
                a2[i1] = scanner.nextInt();

            }
        }

        for (int i1 = 1; i1 < a3.length; i1++) {
            if (scanner.hasNext()) {
                a3[i1] = scanner.nextInt();
            }
        }

        int i1 = maxValue(i, a1, a2, a3);
        System.out.println(i1);

    }


    public static int maxValue(int a, int[] b, int[] c, int[] d)    {
        int b2=0;

        for (int i : b) {
            b2+=i;
        }

        int [] maxvalues=new int[b2+1];
        int [] c1=new int[b2+1];
        int [] d1=new int[b2+1];


        int b1=0;

        int cc=1;
        for (int i = 1; i < b.length; i++) {

            b1=b[i];

            while (b1>0){
             c1[cc]=c[i];
             d1[cc]=d[i];
                b1--;
                cc++;
            }
        }
//        int[] maxvalue = new int[b.length];
        for (int i = 0; i < maxvalues.length; i++) {
            maxvalues[i] = d1[i] - c1[i];
        }
        int [] A=new int[a+1];

        for (int i = 1; i < maxvalues.length; i++) {

            for (int j = a; j >= c1[i] ; j--) {

                A[j]=Math.max(A[j-c1[i]]+maxvalues[i],A[j]);

            }
        }

          return a+A[a];
    }
}

本质还是背包问题,动态规划, 如果将余额当成背包体积,成本当作每个物品的体积,利润即为最大价值,将各个物品最大购买数量进行求和,建立新的数组,这样就处理为背包问题了; 关于背包问题:基本思路还是 前n-1项的和与n 项的最大利润进行比较,取最大的一个。保证每一项都是最大利润; A[j]=Math.max(A[j-c1[i]]+maxvalues[i],A[j]);

alt

alt

图片借鉴于:https://www.bilibili.com/video/BV1K4411X766?spm_id_from=333.999.0.0

全部评论

相关推荐

1 3 评论
分享
牛客网
牛客企业服务