简单DP的小见解(入门背包)
简单DP的小见解(入门背包) n为个数,m为大小,v[]为单个物品体积,w[]为此物品的价值 01背包(每种物品只能选0件或者1件) 引例:假设小偷去珠宝店盗窃,他的背包容量为C=10,珠宝店里有3件珠宝可以盗窃,问可以装入背包的最大价值是多少。 想要求装入背包的最大价值,肯定要在尽量装满背包的情况下拿走价值尽可能高的物品,使得最后的总价值最大化 dp[n] [m]为第n件物品剩余m空间 第i件物品是否可以拿,存在两种情况: (1)剩余空间不能装下此物品,那么问题转化为将前i-1件物品放入背包中所获得的最大价值.。 (2)剩余空间可以装下此物品,想要求i件物品最优解,对于此物品又面临拿与不拿两种情况: a.拿走此物品,此时的价值就应该是(i-1)件物品时的最优解加上此物品的价值。相应的,因为拿走了这件物 品,空间也会对应减少,此时的状态即:dp[i-1] [j-space[i]]+val[i] b.不拿此物品,此时的价值就应该与拿走前(i-1)件物品获得的最大价值相同,虽然没有拿走这个物品,但是空间也没有减少,这意味着剩下的空间还可以装别的东西。此时状态为:dp[i-1] [j] 得出判断条件 (二维数组) if(j<space[i]) //剩余空间小于该物品体积 dp[i][j]=dp[i-1][j]; else dp[i][j]=max(dp[i-1][j],dp[i