51nod多重背包问题
2016-04-20 16:39
323 查看
多重背包其实就是把01背包和完全背包写成两个函数然后调用一下就行了,当给的空间大于物品个数*它的容量的时候,那么对于这个物品来说相当于完全背包,反之则为01背包
//n为物品的种类,w为背包的容量,v[]是物品体积,price[]是物品价值,num[]是物品数量
//n为物品的种类,w为背包的容量,v[]是物品体积,price[]是物品价值,num[]是物品数量
#include <iostream> using namespace std; int v[105],price[105],num[105]; long long dp[50005]; void Zero_Pack(int value,int vv,int w) { for(int i=w; i>=vv; i--) dp[i]=max(dp[i],dp[i-vv]+value); } void Complete_Pack(int value,int vv,int w) { for(int i=vv; i<=w; i++) dp[i]=max(dp[i],dp[i-vv]+value); } long long Pack(int v[],int price[],int num[],int n,int w) { for(int i=1; i<=n; i++) { if(num[i]*v[i]>w) { Complete_Pack(price[i],v[i],w); } else { int k=1; while(k<num[i]) { Zero_Pack(k*price[i],k*v[i],w); num[i]-=k; k=k<<1; } Zero_Pack(num[i]*price[i],num[i]*v[i],w); } } return dp[w]; } int main() { int n,w; while(cin>>n>>w) { long long sum=0; for(int i=1; i<=n; i++) cin>>v[i]>>price[i]>>num[i]; sum=Pack(v,price,num,n,w); cout<<sum<<endl; } return 0; }
相关文章推荐
- PHP动态规划解决0-1背包问题实例分析
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- PHP贪婪算法解决0-1背包问题实例分析
- PHP回溯法解决0-1背包问题实例分析
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告