POJ1837http://poj.org/problem?id=1837
题目大意就是说有一个称上有C个挂钩,告诉你每个挂钩的位置,现在有G个重物,求是之平衡的方法数。
转化一下:DP[i][j]表示第i个物品挂上之后偏移量为j的方法数,所以最后结果就是DP[C][0]。下标不能有负数,所以整体往右移动7500即可。
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define mem0(a) memset(a,0,sizeof(a)) typedef long long LL;
const double eps = 1e-;
const int MAXN = ;
const int MAXM = ; int DP[][], x[], w[];
int C, G; int main()
{
while(~scanf("%d%d", &C, &G))
{
mem0(DP);
for(int i=;i<=C;i++) scanf("%d", &x[i]);
for(int i=;i<=G;i++) scanf("%d", &w[i]);
DP[][] = ;
for(int i=;i<=G;i++)
{
for(int j=;j<;j++)
{
if(DP[i-][j])
{
for(int k=;k<=C;k++)
{
DP[i][j+x[k]*w[i]] += DP[i-][j];
}
}
}
}
printf("%d\n", DP[G][]);
}
return ;
}