多重背包二进制
来源:互联网 发布:小燕子变真格格知画 编辑:程序博客网 时间:2024/06/08 18:56
#include<iostream>//拆分物品,将多重背包转化为01背包 #include<cmath>#include<cstring> using namespace std;const int maxn=10000;int cnt=0;//将新物品插到++cnt int v[maxn],w[maxn];//v[]代表占用体积,w[]代表价值int n,m;//n个物品,总体积为mint bin[33],f[maxn]; void binary(){//二进制数组;bin[i]代表2的i次方 bin[0]=1; for(int i=1;i<=32;i++) bin[i]=bin[i-1]<<1;} void add(int a,int b,int c){//将每个物品拆成二进制 int k=c,x=0;//k代表此物品还能拆成k个物品 while(k>=bin[x]){ v[++cnt]=bin[x]*a; w[cnt]=bin[x]*b; k-=bin[x++]; } if(k){//如果放不下bin[x]个物体并且k不等于0,那么就直接再放k个物体 v[++cnt]=a*k; w[cnt]=b*k; }}int main(){ cin>>n>>m; binary();//记得调用函数 for(int i=1;i<=n;i++){ int a,b,c;//a代表占用体积,b代表价值,c代表个数 cin>>a>>b>>c; add(a,b,c); } memset(f,0,sizeof(f)); for(int i=1;i<=cnt;i++)//转化为01背包 for(int j=m;j>=v[i];j--) f[j]=max(f[j-v[i]]+w[i],f[j]); cout<<f[m]<<endl; return 0;}/*将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为?1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。*//* 5 10005 20 36 10 52 1 14 4 43 3 3136*/
0 0
- HDU1059_Dividing【多重背包】【二进制】
- 多重背包二进制
- 多重背包二进制优化
- 多重背包二进制优化
- 多重背包二进制优化
- 多重背包--二进制优化
- hdu1059Dividing 多重背包二进制优化
- HDU1059Dividing 二进制优化多重背包
- HDU2191 多重背包(二进制思想)
- 多重背包的二进制转化
- 多重背包二进制分解思想
- HDU2844_Coins【多重背包】【二进制优化】
- HDU 1059 多重背包 二进制
- Dividing(多重背包+二进制优化)
- HDOJ2844Coins【多重背包+二进制优化】
- POJ1014Dividing【多重背包+二进制优化】
- poj 1276 多重背包+二进制
- hdu3732 多重背包+二进制优化
- MySQL 使用序列化表的方法实现行转列
- 斯坦福大学深度学习与自然语言处理第一讲:引言
- 1到a的奇数的和
- tomcat 的 SSL 配置
- 斯坦福大学深度学习与自然语言处理第二讲:词向量
- 多重背包二进制
- java实用教程
- java第二十五节-多线程socket通信
- 面试大全1
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- 算法导论一——关于MergeSort(归并排序)总结
- 设计模式之职责链模式
- Material Design 实现之主题使用Theme
- POJ2387 Til the Cows Come Home