动态规划--背包问题

动态规划问题的基本介绍
  • 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
  • 动态规划算法与分治算法类似,其基本思想也是将待求解的问题分解成若干个子问题,先解决子问题,然后从这些子问题的解得到原问题的解。
  • 与分治法不同的是,适合用于动态规划求解的问题,经分解得到子问题往往不是相互独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)
  • 动态规划可以通过填表的方式进行逐步推广,得到最优解。
应用场景-背包问题

image-20220218170238744
在这里插入图片描述

image-20220218213524193

package com.xxxx.tenmath;

public class dynamic {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		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];
		
		//为了记录放入商品的情况,我们定一个二维数组
		int[][] path=new int[n+1][m+1];
		
		//初始化第一行和第一列,这里在本程序中,可以不去处理,因为默认就是0
		for(int i=0;i<v.length;i++) {
			v[i][0]=0;//将第一列设置为0
		}
		for(int i=0;i<v[0].length;i++) {
			v[0][i]=0;
		}
		
		//根据前面得到的公式来动态规划处理
		for(int i=1;i<v.length;i++) {
			for(int j=1;j<v[i].length;j++) {
				if(j<w[i-1]) {//因为我们程序i是从1开始的,因此原来的公式中的w[i]修改为w[i-1]
					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]]);
					//为了记录商品存放到背包的情况,我们不能直接使用上面的公式,需要使用if-else来体现公式
					if(v[i-1][j]<val[i-1]+v[i-1][j-w[i-1]]) {
						v[i][j]=val[i-1]+v[i-1][j-w[i-1]];
						//把当前的情况记录到path中
						path[i][j]=1;
					}else {
						v[i][j]=v[i-1][j];
					}
				}
			}
		}
		
		
		
		
		
		//输出遍历查看
		for(int i=0;i<v.length;i++) {
			for(int j=0;j<v[i].length;j++) {
				System.out.print(v[i][j]+" ");
			}
			System.out.println();
		}
		
		//动脑筋
		int i=path.length-1;
		int j=path[0].length-1;
		while(i>0&&j>0) {
			if(path[i][j]==1) {
				System.out.printf("第%d个商品放入背包\n",i);
				j-=w[i-1];
			}
			i--;
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值