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