动态规划0-1背包(java语言)

0-1背包问题
输入:
第一行 c(背包容量) n(物品数)
第二行:重量数组[]w
第三行:价值数组[]v

输出:最大价值

input1
20 5
6 4 8 8 4
8 4 8 10 2

output1
22

input2
10 5
3 5 6 3 2
6 3 4 2 2

output2
11

input3
10 5
2 2 6 5 4
6 3 5 4 6

output3
15

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int c=sc.nextInt();
        int n=sc.nextInt();
        int []w=new int[n+1];
        int []v=new int[n+1];
        int [][]m=new int[n+1][c+1];

        for (int i = 1; i <=n; i++) {//初始化w
            w[i]=sc.nextInt();
        }

        for (int i = 1; i <=n; i++) {//初始化v
            v[i]=sc.nextInt();
        }

        for (int j = 0; j <=c; j++) {//初始化m的最后一行
            if(j<w[n]){
                m[n][j]=0;
            }else{
                m[n][j]=v[n];
            }
        }

        //初始化[][]m
        for (int i = n-1; i >=1; i--) {
            for (int j = 0; j <=c; j++) {
                m[i][j]=m(m, i, j, w, v);
            }
        }
        //找最大价值和最优解
        boolean [] flag=new boolean[n+1];
        for (int i = 1; i <=n-1; i++) {
            if(m[i][c]==m[i+1][c]){
                flag[i]=false;
            }else{
                flag[i]=true;
                c-=w[i];
            }
        }

        if(w[n]<=c){
            flag[n]=true;
        }else{
            flag[n]=false;
        }

        int sum=0;
        for (int i = 1; i < flag.length; i++) {
            if(flag[i]==true){
                sum+=v[i];
            }
        }
        System.out.println(sum);//最大价值


    }

    public static int m(int[][]m,int i,int j,int []w,int[]v){
        if(j>=w[i]){
            return Math.max(m[i+1][j], m[i+1][j-w[i]]+v[i]);
        }else{
            return m[i+1][j];
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36442947/article/details/78724272