算法——动态规划

动态规划算法介绍:

1、动态规划算法的核心思想是:将大问题划分成小问题进行解决,从而一步步获取最优解的处理算法。

2、动态规划算法与分治算法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

3、与分治不同的是,适用于动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在一个子阶段的界的基础上,进行下一步的求解)

4、动态规划可以通过填表的方式来逐步推进,得到最优解

用动态规划解决背包问题

 有一个背包,容量为4磅,现有以下物品

物品重量价格
吉他(G)11500
音响(S)43000
电脑(L)32000

1.要求达到的目标为装入的总价值最大,并且重量不超过

2.要求装入的物品不能重复

思路分析和图解:

1、背包问题主要是指一个给定容量的背包,若干具有一定价值的重量的物品,如何选择物品放入背包使物品的价值最大。其中有分01背包和完全背包(完全背包指的是每种物品都有无限件可用)

2、这里的问题属于01背包,即每个物品最多放一个,而无限背包可以转化为01背包

3、算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品。根据w[i](第i个物品)和v[i](第i个物品价值)来确定是否需要将该物品放入背包中,即对于给定n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,c为背包的总量。在令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大值。则我们有下结果:

(1)v[i][0] = v[0][j] = 0;

(2)当w[i]>j时:v[i][j] = v[i-1][j]

(3)当j>=w[i]时:v[i][j] = max{v[i-1][j],v[i-1][j-w[i]+v[i]]}

import java.lang.Math;
public class Main {

	public static void main(String[] args) {
		int[] w = {1,4,3};//物品的重量
		int[] val = {1500,3000,2000};//物品的价值
		int m = 4;//背包的容量
		int n = val.length;//物品的个数
		
		//创建二维数组
		//v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大值
		int[][] v = new int[n+1][m+1];
		
		//初始化第一行第一列,不初始化默认是0
		
		for (int i = 1; i < v.length; i++) {
			for (int j = 1; j < v[0].length; j++) {
				if(w[i-1] > j) {
					v[i][j] = v[i-1][j];
				}else {
					v[i][j] = Math.max(v[i-1][j], val[i-1]+v[i-1][j-w[i-1]]);
				}
			}
		}
		System.out.println(v[n][m]);
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值