算法学习(4) 经典0-1背包问题

1.问题与描述:

有n种物品,第i种物品的重量为wi;价值为vi,i=1,2,3,…n.给定一个背包,最多能装重为c的物品

2.分析

例如,对于问题W={2,3,4,5},v={3,4,5,7},C=9

i\j0123456789
00000000000
10033333333
20034477777
300345789912
40034578101112


3.代码
package competition;

public class Knapsack_0_1 {

	public static void main(String[] args) {
	int w[]= {2,3,4,5},v[]= {3,4,5,7};
	int m[][]=Knapsack(w,v,9);
	int x[]=bulidsolution(m,w,9);
	for(int[]i:m){
		  for(int j:i){
		      System.out.print(j+" ");
		   }
		  System.out.println();
	}
		
	System.out.println();
	for (int i=0;i<x.length;i++) {
		System.out.print(x[i]+" ");
	}
	}



	private static int[][] Knapsack(int[] w, int[] v, int c) {
		int n=w.length;
		int[][] m=new int[n+1][c+1];
		for (int i = 1; i <n+1; i++) {
			m[i][0]=0;
		}
		for (int j = 0; j <c+1; j++) {
			m[0][j]=0;
		}
		
		for(int i=1;i<=n;i++)
			for(int j=1;j<=c;j++) {
				m[i][j]=m[i-1][j];
				if(w[i-1]<=j) {
					if(v[i-1]+m[i-1][j-w[i-1]]>m[i-1][j]) {
						m[i][j]=v[i-1]+m[i-1][j-w[i-1]];
					}
				}
			}
		return m;
	}
	private static int[] bulidsolution(int[][] m, int[] w, int c) {
		int j=c,n=w.length;
		int[] x=new int[n];
		for (int i = n; i>=1; i--) {
			if(m[i][j]==m[i-1][j]) {
				x[i-1]=0;
			}else {
				x[i-1]=1;
				j=j-w[i-1];
			}
				
		}
		return x;
	}
}

output:


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


1 1 1 0 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值