Codevs3269 混合背包 经典背包dp
2016-11-01 20:19
357 查看
Codevs3269 混合背包
引用 DQS博客 中的话:
代码
引用 DQS博客 中的话:
01背包:倒着for。 完全背包:正着for。 多重背包:拆开做01背包,或者条件满足直接完全背包。
代码
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> using namespace std; #define MAXN (200+20) #define MAXV (200000+20) int n, V; int dp[MAXV]; struct pack{ int c, v, num; }l[MAXN]; void zeroonepack(int cost, int value) { for(int i = V; i >= cost; -- i) dp[i] = max(dp[i], dp[i-cost]+value); } void compack(int cost, int value) { for(int i = cost; i <= V; ++ i) dp[i] = max(dp[i], dp[i-cost]+value); } void multpack(int cost, int value, int num) { if(num*cost >= V) compack(cost, value); else{ int k = 1; while(k < num) { zeroonepack(k*cost, k*value); num -= k; k <<= 1; } zeroonepack(num*cost, num*value); } } int main() { cin >> n >> V; for(int i = 1; i <= n; ++ i) scanf("%d%d%d", &l[i].c, &l[i].v, &l[i].num); for(int i = 1; i <= n; ++ i) { if(l[i].num == 1) zeroonepack(l[i].c, l[i].v); else if(l[i].num == -1) compack(l[i].c, l[i].v); else multpack(l[i].c, l[i].v, l[i].num); } cout << dp[V]; return 0; }
相关文章推荐
- CODE[VS]3269 混合背包 (背包DP模板集合)
- CODEVS 3269 混合背包
- codevs 3269 混合背包
- codevs 3269 混合背包
- codevs 3269 混合背包(复习混合背包)
- Codevs 3269 混合背包(二进制优化)
- codevs3269混合背包
- codevs 3269 混合背包
- Codevs3269 混合背包
- BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]
- 【日常学习】【背包DP】codevs1014 装箱问题题解
- codevs3370 选学霸(背包dp,并查集)
- 【基础练习】【背包DP】codevs1068 乌龟棋题解
- codevs1669 运输装备(背包dp)
- [codevs1048]石子归并 区间dp经典
- codevs 2033 邮票 (背包)&& codevs 1047 邮票面值设计 (dfs+dp)
- Codevs_P1261 龙王的礼物(DP+背包)
- Codevs_P1068 乌龟棋(DP+背包问题)
- Codevs1115 开心的金明 ——2006年NOIP全国联赛普及组 普通背包dp
- <背包DP>codevs 1684 垃圾陷阱