动态规划---01背包问题--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,3)}
w=5
输出
7(选择第0,1,3号物品)


分析思路
通常可以用execl分析
在这里插入图片描述
根据表格思路写代码

  • 代码
package bag01jiyidigui;

public class Bag_dp {
		static int[] w= {2,1,3,2}; //重量表
		static int[] v= {3,2,4,2};  //价值表
		static int n=4; //物品数量
		static int W=5; //背包的承重极限
		static int max(int a,int b) {
			return a;
		}
	static int dp() {
		int[][]dp=new int[n][W+1];
		//初始化dp表中的第一行
		for(int i=0;i<W+1;i++) {
			if(i>=w[0]) { //每种容量-0号物品
				dp[0][i]=v[0];
			}
			else {
				dp[0][i]=0;
			}
		}
		//其他行
		for(int i=1;i<n;i++) {
			//j是列,也是背包的剩余容量
			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]=max(i1,i2);
				}
				else {
					dp[i][j]=dp[i-1][j];
				}
			}
		}
		return dp[n-1][W];
	}
}



在这里插入图片描述

发布了137 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/105612487