一、测试数据
测试数据介绍
m是背包容量,n是物品种类数,s是物品个数
采用的数据,n=300,m=500
测试数据数组
int w[] = {0, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 ,3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3};
int v[] = {0, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 };
int s[] = {0, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2};
二、测试代码(包含数据)
一维数组优化
#include <bits/stdc++.h>
#include <time.h>
using namespace std;
int w[] = {0, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 ,3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3};
int v[] = {0, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 };
int s[] = {0, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2};
int Max(int i,int j){
return i>j?i:j;
}
int main()
{
clock_t start = clock();
int n = 300, m = 500;
int f[m+50] = {0};
for(int i = 1; i <= n; i++)
for(int j = m; j >= w[i]; j--)
for(int k = 1; k <= s[i] && j >= k*w[i]; k++)
f[j] = Max(f[j],f[j-k*w[i]]+k*v[i]);
cout<<f[m]<<endl;
clock_t end = clock();
cout<<end - start<< "ms"<<endl;
}
二进制优化
#include <bits/stdc++.h>
using namespace std;
const int N = 20100, M = 2010;
int cnt = 0;
int w[] = {0, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 ,3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3};
int v[] = {0, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 };
int s[] = {0, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2};
int w1[N],v1[N],f[M];
int main() {
clock_t start = clock();
int N = 300,V = 500;
for(int i = 0;i < N; ++i) {
int k = 1;
while(k <= s[i]) {
w1[cnt] = w[i] * k;
v1[cnt] = v[i] * k;
s[i] -= k;
k <<= 1;
cnt ++;
}
if(s[i] > 0) {
w1[cnt] = w[i] * s[i];
v1[cnt] = v[i] * s[i];
cnt ++;
}
}
N = cnt;
for(int i = 0;i < N+1; ++i) {
for(int j = V;j >= w1[i]; --j) {
f[j] = max(f[j],f[j - w1[i]] + v1[i]);
}
}
cout << f[V] << endl;
clock_t end = clock();
cout<<end - start<< "ms"<<endl;
return 0;
}
单调队列优化
#include <bits/stdc++.h>
using namespace std;
const int N = 20010;
int f[N],g[N],q[N];
// q 是队列,存的是 下标 k 的倍数
// 要取窗口内的最大值,所用队列为单调递减队列
int w[] = {0, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 ,3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3};
int v[] = {0, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6, 3, 1, 2, 4, 7, 4, 8, 3, 10, 8, 7, 1, 4, 3, 2, 7, 5, 8, 4, 2, 1, 4, 3, 2, 2, 4, 7, 3, 1, 6,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,4, 2, 1, 4, 3, 2, 2, 4, 7, 3,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2 };
int s[] = {0, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 2, 5, 4, 2, 5, 8, 9, 2, 5,2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 4, 2, 1, 4, 5, 6, 2, 1, 2, 8, 3, 4, 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2, 5, 4, 2, 5, 8, 9, 2, 5, 4, 7, 2, 4, 7, 4, 2, 5, 4 , 3, 8, 2, 5, 8, 6, 2, 1, 4, 5, 6, 2, 1, 2, 3, 4, 5, 2, 3, 2, 5, 4, 7, 5, 8, 9, 2, 3, 2, 2};
int main() {
clock_t start = clock();
int n = 300 ,m = 500;
//int w,v,s;
for(int i = 0;i < n; i++){
memcpy(g,f,sizeof(f));
//cin>>w>>v>>s;
for(int j = 0;j < w[i]; j++){
int h = 0,t = -1;
for(int k = j;k <= m; k += w[i]){
if(h<=t && q[h]<k-s[i]*w[i])
h++;
if(h<=t)
f[k]=max(g[k],g[q[h]]+(k-q[h])/w[i]*v[i]);
while(h<=t && g[k]>=g[q[t]]+(k-q[t])/w[i]*v[i])
t--;
q[++t]=k;
}
}
}
cout << f[m] << endl;
clock_t end = clock();
cout<<end - start<< "ms"<<endl;
return 0;
}