多重背包 二进制拆分这个向左移动以为是×2也是被我写出来了

include <bits/stdc++.h>

using namespace std;
int dp[105];int v[2000];int w[2000];
int main()
{
int c;cin>>c;
while(c--)
{
int n,m;cin>>n>>m;
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
memset(dp,0,sizeof(dp));
int num=1;int vv,ww,nn;
for(int i=0;i<m;i++)
{
cin>>vv>>ww>>nn;
for(int i=1;i<=nn;i<<1)//拆分成单个背包
{
v[num]=ivv;
w[num++]=i
ww;
nn-=i;
}
if(nn)
{
v[num]=nvv;
w[num++]=n
ww;
}
}
for(int i=1;i<num;i++)//01 的一维写法
{
for(int j=n;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout<<dp[n]<<endl;
}
}
``

posted @ 2025-11-22 21:20  ll今天也要加油啊  阅读(0)  评论(0)    收藏  举报