问题:
https://www.acwing.com/activity/content/problem/content/1000/
分析:
题目中的数据量为1000,2000,2000,如果使用朴素做法,时间复杂度是40亿。会导致TLE
可以使用2进制将每一个物品的数量存储到背包里面,变成 0-1 背包问题,其中背包中物品的数量会变为 log2(2000) < 3log2(10) < 12,时间复杂度会变为 12 × 1000 × 2000 = 2.4e6 ,c ++ 可以在1秒内算完,不会TLE。
代码实现:
#include<iostream>
using namespace std ;
const int N = 12 * 1000 ;
int n, m ;
int v[N], w[N] ;
int f[N] ;
int main()
{
cin >> n >> m ;
int cnt = 0 ;
for(int i = 1 ; i <= n ; i ++)
{
int a, b, s ;
cin >> a >> b >> s ;
for(int j = 1 ; j <= s ; j *= 2)
{
cnt ++ ;
v[cnt] = j * a ;
w[cnt] = j * b ;
s -= j ;
}
if(s)
{
cnt ++ ;
v[cnt] = s * a ;
w[cnt] = s * b ;
}
}
for(int i = 1 ; i <= c ; i ++)
for(int j = m ; j >= v[i] ; j --)
f[j] = max(f[j], f[j - v[i]] + w[i]) ;
cout << f[m] << endl ;
return 0 ;
}