标签:
//n个物品 , 容量为m
//每个物品1个占用空间为w
//如果第i个物品选了k(k>0)个,所得权值为k*a+b
//求最大权值
//多重背包 , 需要用二进制数优化
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 2010 ;
int dp[maxn][maxn] ;
int main()
{
// freopen("in.txt" , "r" , stdin) ;
int t ;
scanf("%d" , &t) ;
while(t--)
{
memset(dp[0] , 0 , sizeof(dp)) ;
int n , m ;
scanf("%d%d" , &m , &n) ;
for(int i = 1;i <= n;i++)
{
int w ,a , b ;
scanf("%d%d%d" , &w , &a , &b) ;
int c = m/w ;
memcpy(dp[i] , dp[i-1] ,sizeof(dp[i-1])) ;
for(int k = 1;k <= c ;k *= 2)
{
for(int j = m;j >= k*w;j--)
dp[i][j] = max(dp[i][j] , max(dp[i][j - k*w] + a*k , dp[i-1][j - k*w] + a*k + b)) ;
c -= k ;
}
if(c)
for(int j = m ;j >= c*w ;j--)
dp[i][j] = max(dp[i][j] , max(dp[i][j-c*w] + a*c , dp[i-1][j - c*w] + a*c + b)) ;
}
cout<<dp[n][m]<<endl;
}
return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu5410CRB and His Birthday 多重背包
标签:
原文地址:http://blog.csdn.net/cq_pf/article/details/48090243