对于任何一个重量都存储一个状态变量,将0重量初始化为1,然后遍历所有砝码,碰到i是1,就将i+wj*k,k=1~nj都设置为1。最后遍历状态变量统计1的数量
#include<iostream>
using namespace std;
int main()
{
int status[20001],i,j,data,quantity,weight[20],number[20],max;
cin>>data;
while(data-- > 0)
{
for(i=0;i<20001;i++) status[i] = 0;
cin>>quantity;
max = 0;
status[0] = 1;
for(i=0;i<quantity;i++)
cin>>weight[i];
for(i=0;i<quantity;i++)
cin>>number[i];
while(quantity-- > 0)
{
for(i=max;i>=0;i--)
if(status[i])
{
for(j=1;j<=number[quantity] && i+weight[quantity]*j < 20001;j++)
status[i+weight[quantity]*j] = 1;
if(max < i+weight[quantity]*(--j))
max = i+weight[quantity]*j;
}
}
for(quantity=i=0;i<=max;i++)
if(status[i]) quantity++;
cout<<quantity<<endl;
}
return 0;
}
using namespace std;
int main()
{
int status[20001],i,j,data,quantity,weight[20],number[20],max;
cin>>data;
while(data-- > 0)
{
for(i=0;i<20001;i++) status[i] = 0;
cin>>quantity;
max = 0;
status[0] = 1;
for(i=0;i<quantity;i++)
cin>>weight[i];
for(i=0;i<quantity;i++)
cin>>number[i];
while(quantity-- > 0)
{
for(i=max;i>=0;i--)
if(status[i])
{
for(j=1;j<=number[quantity] && i+weight[quantity]*j < 20001;j++)
status[i+weight[quantity]*j] = 1;
if(max < i+weight[quantity]*(--j))
max = i+weight[quantity]*j;
}
}
for(quantity=i=0;i<=max;i++)
if(status[i]) quantity++;
cout<<quantity<<endl;
}
return 0;
}