关于背包问题的思考

关于背包问题的思考

Demo
背包的容量M=8,物品的种类=4,四个物品的体积依次为2、3、4、5,他们的价值依次为3、4、5、6,求出背包所装载物品的最大价值?

物品价值与体积对照表

物品体积价值
123
234
345
456

代码思路我是从这个博客上找的
经典算法总结——背包问题(java实现)【已完结】

代码

// An highlighted block
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] weight={2,3,4,5};
		int [] value={3,4,5,6};
      System.out.println(find(8,4,weight,value));
	}
	 public static int find(int V,int N,int[] weight,int[] value){

	        //初始化动态规划数组
	        int[][] dp = new int[N+1][V+1];
	        //为了便于理解,将dp[i][0]和dp[0][j]均置为0,从1开始计算
	        for(int i=1;i<N+1;i++){
	            for(int j=1;j<V+1;j++){
	                //如果第i件物品的重量大于背包容量j,则不装入背包
	                //由于weight和value数组下标都是从0开始,故注意第i个物品的重量为weight[i-1],价值为value[i-1]
	                if(weight[i-1] > j)
	                    dp[i][j] = dp[i-1][j];
	                else
	                    dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weight[i-1]]+value[i-1]);
	            }
	        }
	        for(int i=0;i<N+1;i++)
	        {
	        	for(int j=0;j<V+1;j++)
	        	{
	        		System.out.print(dp[i][j]+" ");
	        	}
	        	System.out.println("");
	        }
	        	
	        return dp[N][V];
	 }

}

可以通过下面代码打印的二维数组分析这个动态规划过程,我们可以看到这是一个5行9列的二维数组,行数是代表有几个物品可以供选择,列数代表背包的容量是多少。我们可以举几个例子来看一看,例如第三行第六列的7,由于处于第六列,说明此时它的容量为五,处于第三行,说明此时可供他选择的物品有前两种,通过状态方程:dp[i][j] = (dp[i-1][j] > (dp[i-1][j-weight[i]]+value[i]))? dp[i-1][j]:(dp[i-1][j-weight[i]]+value[i]) ,可以分析出它存入的是价值为4的第二个物品和第二行第二列的价值所代表的物品,而第二行第二列的物理意义是只有一个空间为2的位置和只有第一个物品可供选择。再例如第五行第八列的价值9,由于处于第八列说明此时它的容量为七,处于第五行,则可供选择的物品是前四个及所有物品,而该位置的价值选择就是选取了第四个物品和第三行第二列的价值所代表的物品,第三行第二列的物理意义是可以选择前三种物品,但是容量只有二,所以只能选择价值为3,体积为2的第一种商品。

0 0 0 0 0 0 0 0 0 
0 0 3 3 3 3 3 3 3 
0 0 3 4 4 7 7 7 7 
0 0 3 4 5 7 8 9 9 
0 0 3 4 5 7 8 9 10 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我为您简单介绍一下这些问题的情况: 1. 0/1背包问题:可以使用贪心算法、动态规划算法和回溯算法解决。其中,贪心算法时间复杂度为O(nlogn),动态规划算法时间复杂度为O(nW),回溯算法时间复杂度为O(2^n)。三种算法的区别在于贪心算法和回溯算法都可能无法得到最优解,而动态规划算法可以得到最优解,但需要消耗更多的时间和空间。 2. TSP问题:可以使用贪心算法、分支限界算法和模拟退火算法等多种算法解决。其中,贪心算法时间复杂度为O(n^2logn),分支限界算法时间复杂度为O(n^2 2^n),模拟退火算法的时间复杂度一般为O(kn^2),其中k是算法中需要调整的参数。三种算法的区别在于贪心算法只能得到近似最优解,而分支限界算法和模拟退火算法可以得到较为精确的最优解,但需要更多的计算资源支撑。 3. 多段图问题:可以使用动态规划算法和最短路径算法解决。其中,动态规划算法时间复杂度为O(n^2),最短路径算法时间复杂度为O(nmlogm),其中n和m分别为图中的顶点数和边数。两种算法的区别在于动态规划算法适用于多段图中只有一个起点和一个终点的情况,而最短路径算法适用于有多个起点和终点的情况,同时最短路径算法还可以处理图中存在负权边的情况。 以上是这些问题的简要介绍,如果您有需要,可以再向我提出更加详细的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值