OJ题目 : click here ~~
题目分析:就一个多重背包,在输入的时候进行二进制拆分,接下来就与01背包一样处理了。关于二进制拆分,这里讲解的不错~
AC_CODE
int v[1002] , c[1002];
int dp[1002];
int main()
{
int t;
cin >> t;
while(t--)
{
int n ,m , i , j , a , b , d ,k = 0;
cin >> n >> m;
for(i =1;i <= m;i++)
{
scanf("%d%d%d",&a ,&b ,&d);
for(j = 1;j <= d;j <<= 1)//进行二进制拆分
{
c[k] = j*a;
v[k++] = j*b;
d -= j;
}
if(d > 0)
{
c[k] = d*a;
v[k++] = d*b;
}
}
memset(dp , 0 , sizeof(dp));
for(i = 0;i < k;i++)
for(j = n;j >= c[i];j--)
dp[j] = max(dp[j] , dp[j - c[i]] + v[i]);
cout << dp[n] << endl;
}
return 0;
}