摘要: 描述:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。变式:有的物品能只有1个,有的物品有多个。状态转移方程:dp[i][j]=max{dp[i][j],dp[i-1][j-c[i]*k]+w[i]*k}//0s){ total++; w[total]=w[i]*s; c[total]=c[i]*s n[i]=n[i]-s; s=s*2; } w[i]=n[i]*i;}空间优化后的0... 阅读全文
posted @ 2013-08-02 19:48 little_w 阅读(526) 评论(1) 推荐(2)
摘要: 一、01背包问题简述:n种物品,每种一个,选或不选随你,背包一定有容量,求不超过容量的情况下,价值最大。递归方程:dp[i][v]=max{dp[i][v],dp[i-1][v-c[i]]+w[i]}我们要注意的是下一次背包放I个物品的状态的可达性必然要满足上一次放I-1个物品时的可达性,觉得数学归纳法可以证明出来。所以这里有个隐含的判断,就是初始时memset(dp,0,sizeof(dp));在这里已经将dp清零,所以我们可以认为在dp==0是,这一节点是没有被访问到的。因为我们取得是大的值,自然0的情况怎么都不会被选中。递推表示:memset(dp,0,sizeof(dp));for(i 阅读全文
posted @ 2013-08-02 15:40 little_w 阅读(413) 评论(0) 推荐(0)