1 1000 5 800 2 400 5 300 5 400 3 200 2
3900
#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
int i,j,n,m;
int v[25],p[25],dp[30000],sum[25];
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
memset(p,0,sizeof(p));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&v[i],&p[i]);//v[25],p[25] 数组用于存放物品的价格与重要度
sum[i]=v[i]*p[i]; //计算乘积
}
for(i=0;i<m;i++)
{
for(j=n;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+sum[i]);//每进行一遍内循环dp[n]中都保留当前(i+1)个数中最大值
}
}
printf("%d\n",dp[n]);//当进行完循环后 dp[n]中保留了m个数组成的最大值 ,即所求
}
return 0;
}原文地址:http://blog.csdn.net/u013238646/article/details/40683997