题目: http://poj.org/problem?id=1837
感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇。。
1 #include <stdio.h> 2 #include <string.h> 3 4 int dp[20][15000]; 5 int c[20], w[20]; 6 7 int main() 8 { 9 int n, m; 10 scanf("%d %d", &n, &m); 11 //天平上有n个砝码位置 12 for(int i = 1; i <= n; i++) 13 { 14 scanf("%d", &c[i]); 15 } 16 //有m和砝码 17 for(int i = 1; i <= m; i++) 18 { 19 scanf("%d", &w[i]); 20 } 21 22 memset(dp, 0, sizeof(dp)); 23 24 //0到15000来表示-7500到7500,这样保证数组下标为正。不挂砝码时天平平衡方案为1 25 dp[0][7500] = 1; 26 27 //挨个挂上每个砝码 28 for(int i = 1; i <= m; i++) 29 { 30 //枚举所有状态 31 for(int j = 0; j <= 15000; j++) 32 { 33 if(dp[i-1][j]) 34 { 35 for(int k = 1; k <= n; k++) 36 { 37 dp[i][j+c[k]*w[i]] += dp[i-1][j]; 38 } 39 } 40 } 41 } 42 printf("%d ", dp[m][7500]); 43 return 0; 44 }