01背包,多重背包,完全背包JAVA实现

package beibao;

public class bagQuestion {
    public static void main(String[] args) {
        int number=4;
        int[] weight= { 1,3,4,2};
        int[] value= { 1500,3000,2000,3500};
        int capacity=4;
        int[][] dp=new int[number+1][number+1];
        int[] num= {2,1,3,1};
        System.out.println(bag3(capacity, weight, value));
        System.out.println(bag4(capacity, weight, value,num));
        for(int i=1;i<dp.length;i++) {
            for(int j=1;j<dp[0].length;j++) {
                if(weight[i-1]>j) {
                    dp[i][j]=dp[i-1][j];
                }else {
                    dp[i][j]=Math.max(dp[i-1][j], value[i-1]+dp[i-1][j-weight[i-1]]);
                }
            }
        }
        for(int i=0;i<dp.length;i++) {
            for(int j=0;j<dp[0].length;j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        int j=capacity;
        String numStr="";
        for(int i=number;i>0;i--) {
            if(dp[i][j]>dp[i-1][j]) {
                numStr=i+" "+numStr;
                j -=weight[i-1];
            }
            if(j==0)
                break;
        }
        System.out.println(numStr);
    }
    //0-1背包问题
    public static int bag2(int W,int[] w,int[] v) {
        int[] f=new int[W+1];
        for(int i=1;i<W+1;i++) {
            for(int j=W;j>=w[i-1];j--) {
                f[j]=Math.max(f[j], f[j-w[i-1]]+v[i-1]);
            }
        }
        return f[W];
    }
    //完全背包问题(物品没有数量限制)
    public static int bag3(int W,int[] w,int[] v) {
        //第一种方法
        int[] f=new int[W+1];
        for(int i=1;i<W+1;i++) {
            for(int j=w[i-1];j<=W;j++) {
                f[j]=Math.max(f[j],f[j-w[i-1]]+v[i-1]);
            }
        }
        return f[W];
        //第二种方法
//        int n = w.length - 1;// 第一个值,不算
//        int[] f = new int[W + 1];
//        for (int i = 1; i <= n; i++)
//            for (int j = w[i]; j <= W; j++)
//                f[j] = Math.max(f[j], f[j - w[i]] + v[i]);
//        return f[W]; // 最优解
    }


    //完全背包问题(物品有数量限制)多重背包问题
    public static int bag4(int W,int[] w,int[] v,int[] num) {
        int[] f=new int[W+1];
        for(int i=1;i<=w.length;i++) {
            for(int j=W;j>=w[i-1];j--) {
                for(int k=0;k<=num[i-1]&&j-k*w[i-1]>=0;k++) {
                    f[j]=Math.max(f[j], f[j-k*w[i-1]]+k*v[i-1]);
                }
            }
        }
        return f[W];
    }
}
全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务