【codevs】3269 混合背包
来源:互联网 发布:淘宝aj比较靠谱的店 编辑:程序博客网 时间:2024/06/11 14:15
3269 混合背包
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?输入描述 Input Description
第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限输出描述 Output Description
1个数Ans表示所装物品价值的最大值样例输入 Sample Input
2 103 7 2
2 4 -1
样例输出 Sample Output
22
多重背包,考虑:如果mi*vi >= V 那么按照完全背包来做;否则,二进制拆分,再按照01背包来做。
#include <bits/stdc++.h>using namespace std;const int maxn = 200005;struct node{ int vi; int wi; int mi;}vis[205];int n,v;int dp[maxn];void zero_one_package(int ww,int vv){ for(int j=v;j>=vv;j--) { dp[j]=max(dp[j],dp[j-vv]+ww); }}void complete_package(int ww,int vv){ for(int j=vv;j<=v;j++) dp[j]=max(dp[j],dp[j-vv]+ww);}void multi_package(int ww,int vv,int mm){ if(mm*vv >= v) complete_package(ww,vv); else { int k=1; while(k <= mm) { zero_one_package(k*ww,k*vv); mm -=k; k = 2*k; // k <<= 1; } zero_one_package(mm*ww,mm*vv); }}int main(){ cin>>n>>v; for(int i=1;i<=n;i++) { cin>>vis[i].vi>>vis[i].wi>>vis[i].mi; } for(int i=1;i<=n;i++) { if(vis[i].mi == 1) zero_one_package(vis[i].wi,vis[i].vi); else if(vis[i].mi ==-1) complete_package(vis[i].wi,vis[i].vi); else multi_package(vis[i].wi,vis[i].vi,vis[i].mi); } cout<<dp[v]<<endl; return 0;}
0 0
- CODEVS 3269 混合背包
- 【codevs 3269】混合背包
- codevs 3269 混合背包
- 3269 混合背包(codevs)
- Codevs 3269 混合背包
- 【codevs】3269 混合背包
- codevs 3269 混合背包
- 3269混合背包——codevs
- Codevs 3269 混合背包(二进制优化)
- codevs 3269 混合背包(模板)
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 动态规划——数塔问题
- Pascal's Triangle
- leetcode42. Trapping Rain Water
- 20位活跃在Github上的国内技术大牛
- 链表插入排序
- 【codevs】3269 混合背包
- JavaScript
- 七月机器学习之决策树随机森林和adaboost11
- 论文笔记 SSD: Single Shot MultiBox Detector
- 堆的建立&堆排序
- 【一颗不甘的心】今天,说说自己
- 数据结构 —— 树 (相关概念)
- linux编程手册第8章用户和组
- 小公司如何做项目管理流程