动态规划——01背包

问题描述
有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
在这里插入图片描述
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值Wi表示第 i 个物品的体积,定义V(i,j)当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
1、建立模型,即求max(V1X1+V2X2+…+VnXn)
2、寻找约束条件W1X1+W2X2+…+WnXn<capacity
3、寻找递推关系式,面对当前商品有两种可能性:
包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);
由此可以得出递推关系式:
j<w(i) V(i,j)=V(i-1,j)
j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}

public class fgfg {
	    public static void main(String[] args) {
	    	int w [] = {2,3,4,5};
	    	int v [] = {3,4,5,6};
	    	int capacity = 8;
	    	System.out.println(findMax(capacity,w,v));
	    }
	    public static int findMax(int capacity,int w[],int v[]){
	    	int len = w.length;
	    	int i,j;
	    	int result[][] = new int[len+1][capacity+1];
	    	for(i=0;i<capacity+1;i++) {
	    		result[0][i] = 0;
	    	}
	    	for(j=0;j<len+1;j++) {
	    		result[j][0] = 0;
	    	}
	    	int n,m;
	    	for(n=1;n<=len;n++) {
	    		for(m=1;m<=capacity;m++) {
	    			if(w[n-1] <= m) {
	    				result[n][m] = Math.max(result[n-1][m], result[n-1][m-w[n-1]] + v[n-1]);
	    			}
	    			else {
	    				result[n][m] = result[n-1][m];
	    			}
	    		}
	    	}
	    	return result[len][capacity];
	    }    	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值