摘要:
有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}此时他面临的不是01背包的选与不选的问题,而是从n[i]里面选多少个的问题。实现方法:http://acm.hdu.edu.cn/showproblem.php?pid=21911:转化成01背包,将每种背包转换成数量为n[i]的01背包求解View Code #include <iostream 阅读全文
摘要:
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。1:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}2:f[v]=max(f[v],f[v-c[i]]+w[i]);完全背包面临的不是对于第i件物品选不选的问题了而是选多少件了问题了。。。所以f[v]的当前状态允许由当前状态推得。实现方法有是那种1:o(n*v)这里正确理解这句经典的话很关键(引用):换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第 阅读全文
摘要:
不多讲,dd大牛的背包九讲如此之经典我们只能慢慢体会了:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。状态转移方程:1:f[i][v]=max(f[i-1][v],f[i-1][v-c[i]]+w[i]);2:for(i=0;i<N;i++){ for(v=V;v>=c[i];v--) { f[v]=max(f[v],f[v-c[i]]+w[i]); }} 自己的理解: 01背包的主要思想是对于这件物品做出选与不选的决定;将空间优化后V必须是逆序的,因为这样才能保证将当前的第i个物品放进去的时候,f... 阅读全文
摘要:
1001http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1001&cid=13996原来做过的一道题目,我用的贪心,按比重从大到小排序,然后依次选直到不能再放进来为止。注意两点:1:F[j]可能为0因为题目中说的非负数。记得第一次做的时候wa无数次。。2:选完的时候有2种可能:1:n恰好用完,最后不能再选;2:n有剩余,可能n比较大把所有的都选了还有剩余,可能中间出现不能全部将这间屋子里的换完只能换部分。View Code #include <iostream>#include <cstdio>#inc 阅读全文