动态规划实现0-1背包问题

//动态规划实现0-1背包
public class DN01 {
	public static void dy(int []v,int []w,int c,int [][]m){
		int n=v.length-1;
		//i=n
		int jMax=Math.min(w[n]-1, c);
		for(int j=0;j<=jMax;j++) {
			m[n][j]=0;
		}
		for(int j=w[n];j<=c;j++) {
			m[n][j]=v[n];
		}
		//i从n-1到1
		for(int i=n-1;i>=1;i--) {
			jMax=Math.min(w[i]-1, c);
			for(int j=0;j<=jMax;j++) {
				m[i][j]=m[i+1][j];
			}
			for(int j=w[i];j<=c;j++) {
				m[i][j]= Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
			}
		}
		//也可以把i=1单独拿出来,这样减少了计算次数
		/*m[1][c]=m[2][c];
		if(c>=w[1]) {
			m[1][c]= Math.max(m[1][c],m[2][c-w[1]]+v[1]);
		}*/
	}
	public static void gh(int[][]m,int c,int x[],int []w) {
		int n=w.length-1;
		//i从1到n-1
		for(int i=1;i<n;i++) {
			if(m[i][c]==m[i+1][c]) {
				x[i]=0;
			}
			else 
			{
				x[i]=1;
				c=c-w[i];
			}
		}
		//i=n
		x[n]=(m[n][c]>0)?1:0;
	}
	public static void main(String[] args) {
		int []w= {3,4,5,2};     //存各个物品重量
		int []v= {7,9,9,2};     //存各个物品价值
		int n=v.length-1;
		int c=6;     //背包容量
		int m[][] = new int[n+1][c+1];    //m[i][j]表示当背包容量为j,可选物品为i,i+1,,,n时的问题最优值
		dy(v,w,c,m);
		int []x=new int[n+1];
		gh(m,c,x,w);
		int sum=0;
		for(int i=1;i<=n;i++) {
			sum=sum+x[i]*v[i];
		}
		System.out.println(sum);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44000439/article/details/84927820