- 注意事项
- 一定要记住循环里面记录的是2的0次幂加上之后的,一个都不能少
- dp的数组要开的比给的大,大概30倍就够了吧
- 一定要注意里面*的是2次米
- 不要让里面得喝大于num】
`#include<bits/stdc++.h>
using namespace std;
const int maxn=20005;
int dp[maxn],w[maxn],num[maxn],va[maxn];
int va1[maxn*35],w1[maxn*35];
int ci[54];
int main()
{int n,v;
cin>>n>>v;
for(int i=1;i<=n;i++)
{
cin>>va[i]>>w[i]>>num[i];
}
ci[0]=1;
for(int i=1;i<=31;i++)
{
ci[i]=ci[i-1]*2;
}
int n1=0;
for(int i=1;i<=n;i++)
{
int op=0;
for(int j=0;op+ci[j]<num[i];j++)
{ int r=ci[j];
op+=r;
va1[++n1]=va[i]*r;
w1[n1]=w[i]*r;
}
if(num[i]-op>0)
{
va1[++n1]=(num[i]-op)*va[i];
w1[n1]=w[i]*(num[i]-op);
}
}
dp[0]=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n1;i++)
for(int j=v;j>=0;j--)
{
if(j>=va1[i])
{
dp[j]=max(dp[j],dp[j-va1[i]]+w1[i]);
}
}
cout<<dp[v];
return 0;
}`