题目链接。
分析:
不得不说,这是一道好题。
dp[i][j],i代表前i个物品,j代表平衡度为j时的方法数。
#include <stdio.h> #include <stdlib.h> #include <string.h> int dp[21][15002]; int main(){ int n, g, i, j, k, t, c[21], w[21]; scanf("%d %d", &n, &g); for(i=1; i<=n; i++) scanf("%d", &c[i]); for(i=1; i<=g; i++) scanf("%d", &w[i]); memset(dp, 0, sizeof(dp)); dp[0][7500] = 1; for(i=1; i<=g; i++){ for(j=0; j<=15000; j++){ for(k=1; k<=n; k++){ t = c[k]*w[i]; if(j+t >= 0 && j+t <= 15000) dp[i][j+t] += dp[i-1][j]; } } } printf("%d\n", dp[g][7500]); return 0; }