//未优化01背包
#include <iostream>
#include <string.h>
using namespace std;
int c[105],v[105],b[105];
int dp[105];
int main()
{
int n,m,t;
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>c[i]>>v[i]>>b[i];
memset(dp,0,sizeof(dp));
for(int i=1 ;i<=m;i++)
for(int j=1;j<=b[i];j++)
for(int k=n;k>=c[i];k--)
dp[k]=max(dp[k],dp[k-c[i]]+v[i]);
cout<<dp[n]<<endl;
}
return 0;
}
//二进制优化01背包
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int nCase,Limit,nKind,i,j,k, v[111],w[111],c[111],dp[111];
//v[]存价值,w[]存尺寸,c[]存件数
//在本题中,价值是米的重量,尺寸是米的价格
int count,Value[1111],size[1111];
//count存储分解完后的物品总数
//Value存储分解完后每件物品的价值
//size存储分解完后每件物品的尺寸
cin>>nCase;
while(nCase--)
{
count=0;
cin>>Limit>>nKind;
for(i=0; i<nKind; i++)
{
cin>>w[i]>>v[i]>>c[i];
for(j=1; j<=c[i]; j<<=1)
{
Value[count]=j*v[i];
size[count++]=j*w[i];
c[i]-=j;
}
if(c[i]>0)
{
Value[count]=c[i]*v[i];
size[count++]=c[i]*w[i];
}
}
memset(dp,0,sizeof(dp));
for(i=0; i<count; i++)
for(j=Limit; j>=size[i]; j--)
if(dp[j]<dp[j-size[i]]+Value[i])
dp[j]=dp[j-size[i]]+Value[i];
cout<<dp[Limit]<<endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。