动态规划---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];
	}
}



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值