HDU 2191 (多重背包)
//未優化01背包
#include
#include
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<
#include
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>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=size[i]; j--)
if(dp[j]