背包问题的dp方程

背包问题的dp方程(动规)

/*
有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,
求所有挑选方案中价值总和的最大值。
1≤n≤100
1≤wi,vi≤100
1≤W≤10000
输入:
n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5
输出:
7(选择第0,1,3号物品)
因为对每个物品只有选和不选两种情况,所以这个问题称为01背包。
*/

package _9动规;


public class _01背包问题的dp方程 {
	  static int[] w = {2, 1, 3, 2};//重量表
	  static int[] v = {3, 2, 4, 2};//价值表
	  static int n = 4;//物品数量
	  static int W = 5;//背包的承重极限
public static void main(String[] args) {
   int res=dp();
    System.out.println(res);
}
private static int dp() {
	 int [][]dp=new int [n][W+1];
	 //初始化dp表 的第一行
	 for(int i=0;i<W+1;i++) {
		 if(i>=w[0]) {//给个的重量
			 dp[0][i]=v[0];//每一种容量
		 }else {
			 dp[0][i]=0;
		 }
	 }
	//其它行
	 for(int i=1;i<n;i++) {
		for(int j=0;j<W+1;j++) {
			if(j>=w[i]) {
				int i1=v[i]+dp[i-1][j-w[i]];//选择当前物品及i号物品,剩余容量
				int i2=dp[i-1][j];
				dp[i][j]=Math.max(i1, i2);
			}else {
				dp[i][j]=dp[i-1][j];//好像是返回上面存下来的最大值
			}
		}
	 }
	return dp[n-1][W];
}
}

猜你喜欢

转载自blog.csdn.net/weixin_45952706/article/details/107922927