题目链接:
http://poj.org/problem?id=1837
题意:
给出一排钩子的坐标,再给出一排肉的重量,问能使两边平衡的挂肉的方法数目。
题解:
dp[i][j]表示选到第i个物品时,平衡度为j的方法数目,转移方程为:
dp[i][j + c[i]*hook[k]] += dp[i-1][j];
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 30;
int hook[maxn],c[maxn];
int dp[30][15000];
int main()
{
int a,b;
while(~scanf("%d%d", &a, &b))
{
memset(dp,0,sizeof(dp));
for(int i = 0; i < a; i++)scanf("%d", &hook[i]);
for(int i = 0; i < b; i++)scanf("%d", &c[i]);
for(int i = 0; i < a; i++)
{
dp[0][7500 + hook[i] * c[0]] ++;
//cout << 500 + hook[i] * c[0] <<endl;
}
for(int i = 1; i < b; i++)
{
for(int j = 0; j < 15000; j++)
{
for(int k = 0; k < a; k++)
if(dp[i-1][j] != 0)
{
//cout << j <<" "<< c[i] << " " << hook[k] << " " <<j + c[i]*hook[k] <<endl;
dp[i][j + c[i]*hook[k]] += dp[i-1][j];
}
}
}
printf("%d\n", dp[b-1][7500]);
//cout << dp[b-1][500] <<endl;
}
return 0;
}