题目链接:http://i.cnblogs.com/EditArticles.aspx?opt=1
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。
Output
对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。
Sample Input
1 8 2 2 100 4 4 100 2
Sample Output
400
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdio> 5 #include <algorithm> 6 #include <vector> 7 #include <map> 8 using namespace std; 9 10 int max(int a, int b) 11 { 12 return a > b ? a : b; 13 } 14 int main() 15 { 16 int t, n, m, p[110], h[110], c[110], i, j, k, dp[110][110]; 17 scanf("%d", &t); 18 while(t--) 19 { 20 memset(dp, 0, sizeof(dp)); 21 scanf("%d %d", &n, &m); 22 for(i = 1; i <= m; i++) 23 scanf("%d %d %d", p + i, h + i, c + i); 24 for(i = 1; i <= m; i++) 25 { 26 for(j = 1; j <= n; j++) 27 { 28 dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]); 29 for(k = 1; k <= c[i]; k++) 30 { 31 if(j >= k * p[i]) 32 { 33 dp[i][j] = max(dp[i][j], dp[i - 1][j - k * p[i]] + k * h[i]); 34 //cout << i << " " << j << " " << dp[i][j] << endl; 35 } 36 } 37 } 38 } 39 printf("%d ", dp[m][n]); 40 } 41 return 0; 42 }