Java 背包问题

背包1 常用、常见

常用、常见
代码片.

public static void pakege(int [] w,int []v,int maxw) 
    {
       // int[] w = {3,5,2,6,4};//物品重量
       // int[] v = {4,4,3,5,3};//物品价值
      //  int maxw = 12;//背包容量
        int len = v.length;//物品个数
        int[][] f = new int[len+1][maxw+1];
        int i,j;
        for(i = 1; i < f.length; i++)
        {
            for(j = 1; j < f[0].length; j++)
            {
                if(w[i-1] > j)
                    f[i][j] = f[i-1][j];
                else {
                    if(f[i-1][j] < f[i-1][j-w[i-1]] + v[i-1])
                    {
                        f[i][j] = f[i-1][j-w[i-1]] + v[i-1];
                    }
                    else {
                        f[i][j] = f[i-1][j];
                    }
                }
            }
        }
        for(i = 0; i < f.length; i++)
        {
            for(j = 0; j < f[0].length; j++)
                System.out.print(f[i][j] + " ");
            System.out.println();
        }
    }

输出.

	0 0 0 0 0 0 0 0 0 0 0 0 0 
	0 0 0 4 4 4 4 4 4 4 4 4 4 
	0 0 0 4 4 4 4 4 8 8 8 8 8 
	0 0 3 4 4 7 7 7 8 8 11 11 11 
	0 0 3 4 4 7 7 7 8 9 11 12 12 
	0 0 3 4 4 7 7 7 8 10 11 12 12 

背包2 要求给出是哪几个物品放入其中

如果题目要求给出是哪几个物品放入其中,则我们在代码里面加入一个标记数组:

代码片.

 public static void pakege2(int [] weight,int []val,int m)  {

			//        int[] weight = {3,5,2,6,4}; //物品重量
			//        int[] val = {4,4,3,5,3}; //物品价值
			//        int m = 12; //背包容量
        
        int n = val.length; //物品个数
        int[][] f = new int[n+1][m+1]; //f[i][j]表示前i个物品能装入容量为j的背包中的最大价值
        int[][] path = new int[n+1][m+1];
        //初始化第一列和第一行
        for(int i=0;i<f.length;i++){
            f[i][0] = 0;
        }
        for(int i=0;i<f[0].length;i++){
            f[0][i] = 0;
        }
        //通过公式迭代计算
        for(int i=1;i<f.length;i++){
            for(int j=1;j<f[0].length;j++){
                if(weight[i-1]>j)
                    f[i][j] = f[i-1][j];
                else{
                    if(f[i-1][j]<f[i-1][j-weight[i-1]]+val[i-1]){
                        f[i][j] = f[i-1][j-weight[i-1]]+val[i-1];
                        path[i][j] = 1;
                    }else{
                        f[i][j] = f[i-1][j];
                    }
                    //f[i][j] = Math.max(f[i-1][j], f[i-1][j-weight[i-1]]+val[i-1]);
                }
            }
        }
        for(int i=0;i<f.length;i++){
            for(int j=0;j<f[0].length;j++){
                System.out.print(f[i][j]+" ");
            }
            System.out.println();
        }

        int i=f.length-1;
        int j=f[0].length-1;
        while(i>0&&j>0){
            if(path[i][j] == 1){
                System.out.print("第"+i+"个物品装入 ");
                j -= weight[i-1];
            }
            i--;
        }

    }

输出.

	0 0 0 0 0 0 0 0 0 0 0 0 0 
	0 0 0 4 4 4 4 4 4 4 4 4 4 
	0 0 0 4 4 4 4 4 8 8 8 8 8 
	0 0 3 4 4 7 7 7 8 8 11 11 11 
	0 0 3 4 4 7 7 7 8 9 11 12 12 
	0 0 3 4 4 7 7 7 8 10 11 12 124个物品装入 第3个物品装入 第1个物品装入 

背包3 一维数组(装满) 装满

一维数组(装满) 装满
代码片.

public static void pakege3(int [] w,int []v,int maxw) {
			//	        int[] w = {3,5,2,6,4};
			//	        int[] v = {4,4,3,5,3};
			//	        int maxw = 3;
	        int[] f = new int[maxw+1];
	        int i,j;
	        for(i = 1; i < f.length; i++)
	            f[i] = Integer.MIN_VALUE;
	        for(i = 0; i < v.length; i++)
	            for(j = f.length - 1; j >= w[i]; j--)
	                f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);
	                //f[j] = Math.max(f[j], f[j-w[i]] + v[i]);

	        for(i = 0; i < f.length; i++)
	            System.out.print(f[i] + " ");
	    }

输出.

	0 -2147483648 3 4 

背包4 不装满

不装满

代码片.

public static void pakege4(int [] w,int []v,int maxw){ 

		//int[] w = {3,5,2,6,4};//物品重量
		//int[] v = {4,4,3,5,3};//物品价值
		//int maxw = 12;
        int[] f = new int[maxw+1];
        int i,j;
        for(i = 0; i < f.length; i++)
            f[i] = 0;
        for(i = 0; i < v.length; i++)
        {
            for(j = f.length - 1; j >= w[i]; j--)
            {
                //f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);
                f[j] = Math.max(f[j], f[j-w[i]] + v[i]);
            }
        }
        for(i = 0; i < f.length; i++)
            System.out.print(f[i] + " ");
        System.out.println();
    }

输出:

	0 0 3 4 4 7 7 7 8 10 11 12 12 

背包5 双约束

体积约束、质量约束
代码.

public class Main {
	public static int pakage5 (int numberOfRadLiquid, int reactorCap,	int criticalMass,	
			int []volumes,	int []masses,	int []energies)	{

//		int numberOfRadLiquid=5;//小瓶数量
//		int reactorCap=100; //总体积
//		int criticalMass=15; //最大质量
//		int []volumes= {50,40,30,20,10};// maight //每小瓶体积
//		int []masses= {1,2,3,9,5};//每小瓶质量
//		int []energies= {300,480,270,200,180}; // value 每小瓶能量
//      双约束
    int[][][] dp=new int[numberOfRadLiquid+1][reactorCap+1][criticalMass+1];
    for(int i=1;i<numberOfRadLiquid+1;i++) { //总个数(已知的)
        for(int j=1;j<reactorCap+1;j++) {   //限制条件01
            for(int k=1;k<criticalMass+1;k++) { //限制条件02
                if(j<volumes[i-1]||k<masses[i-1]) {
                    dp[i][j][k]=dp[i-1][j][k];
                }else{
                    dp[i][j][k]=Math.max(dp[i-1][j][k], dp[i-1][j-volumes[i-1]][k-masses[i-1]]+energies[i-1]);
                }
            }
        }
    }
    return dp[numberOfRadLiquid][reactorCap][criticalMass];
}
	
	public static void main(String args[]) {
		int numberOfRadLiquid=5;
		int reactorCap=100;
		int criticalMass=15;
		int []volumes= {50,40,30,20,10};// maight
		int []masses= {1,2,3,9,5};
		int []energies= {300,480,270,200,180}; // value
		System.out.println(
			pakage5( numberOfRadLiquid,reactorCap,criticalMass,	volumes,masses,	energies)
						);
	}


}
	

输出.

	960 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值