裸多重背包二进制优化
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll vv[1000005],ww[1000005],mm[1000005],dp[1000005];
ll val[1000005],sizev[1000005];
int main(){
ll n,v,flag=0;
cin>>n>>v;
for(int i=0;i<n;i++){
cin>>vv[i]>>ww[i]>>mm[i];
for(int j=1;j<=mm[i];j<<=1){
val[flag]=j*vv[i];
sizev[flag++]=j*ww[i];
mm[i]-=j;
}
if(mm[i]>0){
val[flag]=mm[i]*vv[i];
sizev[flag++]=mm[i]*ww[i];
}
}
// memset(dp,0,sizeof(dp));
for(int i=0;i<flag;i++){
for(int j=v;j>=sizev[i];j--){
dp[j]=max(dp[j],dp[j-sizev[i]]+val[i]);
}
}
cout<<dp[v]<<endl;
}

本文介绍了一种解决裸多重背包问题的二进制优化算法,通过预处理将多重物品转化为单重物品,简化了动态规划求解过程。算法首先读取物品数量和背包容量,然后输入每个物品的价值、重量和数量,利用二进制优化技巧进行预处理,最后通过动态规划求解最大价值。
2811

被折叠的 条评论
为什么被折叠?



