#include<iostream>
#include<algorithm>
using namespace std;
int dp[205][30005];
int main()
{
int i,j,k,m,N;
int v[205],w[205];
cin>>k;
while(k--)
{
cin>>N>>m;
for(i=0;i<m;i++)
cin>>v[i]>>w[i];
for(j=0;j<=N;j++)
dp[0][j]=0;
for(i=0;i<m;i++)
for(j=0;j<=N;j++)
if(j<v[i])dp[i+1][j]=dp[i][j];
else dp[i+1][j]=max(dp[i][j],dp[i][j-v[i]]+v[i]*w[i]);
cout<<dp[m][N]<<endl;
}
}
滚动数组优化
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[30005];
int main()
{
int i,j,k,m,n,N;
int p[1005],v[1005];
while(cin>>N>>m)
{
for(i=1;i<=m;i++)
cin>>v[i]>>p[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
for(j=N;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+v[i]*p[i]);
cout<<dp[N]<<endl;
}
}