动态规划01背包记录

01背包是动态规划的一种类型其主要的形式是:

   1、所有类型物品每种类型只有一个

   2、一次只能取一个且物品不能分割

   3、只有取或者不取(所以叫01背包,就是只有这两种情况)

   4、在背包容量不满的前提下尽可能多的装入最大价值的物品

      设背包的容量为V,第i个物品的重量为weigh[i]对应的价值为price[i];  设容量为j(j的最大值为背包的容量)的背包所能装的最大价值为dp[j]

n为所有的物品个数,我们先从第1个数据开始,则此物品重量为weigh[1],则我们将所有大于weigh[1]的背包都放入第1个物品(即从dp[V]到

dp[weigh[1]])此时所有的大于weigh[1]重量的背包都装入第一个物品。

      接下来我们装入第2个物品,此时同样我们要对所有的容量大于weigh[2]的背包都装入第二个物品,但是由于装第一个物品时一些背包已经装入

了第一件物品,怎么办呢?分以下几种情况

 1、如果在装入第一件物品后容量不足以装入第二件物品且第一件物品的价值大于第二件则不装入第二件

 2、如果在装入第一件物品后剩余容量不足以装入第二件物品且第一件物品的价值不如第二件的大则将第二件物品装入取出第一件(当然在程序

     中可以直接覆盖当做取出第一件物品)

 3、如果装入第一件物品后容量任然足以装下第二件物品,则将两件物品一同装入背包中

代码实现:

for(i=0;i<n;i++)
{
	for(j=V;j>=weigh[i];j--)//将所有重量大于weigh[i]的背包装入物品 
	{
		dp[j]=max(dp[j],dp[j-weigh[i]]+price[i]);
	}
} 

以此类推  

大神勿喷

原文地址:https://www.cnblogs.com/tonghao/p/4609191.html