poj-1837 Balance ***

/* [转]
*
* d[i][j]表示在挂上前i个物体的时,平衡度为j
* (j>0时表示左边重,j=0时表示天平平衡,j<0时表示右边重)时挂法的数量,
* 而根据题意可以确定j的取值范围为:[-7500,7500],于是可以得到状态转移方程为:
* d[i][j]+=(d[i-1][j-weigh[k]*pos[i]]),
* weigh[k]表示第k个挂钩的位置,pos[i]为第i个砝码的重量
* 由于j-weigh[k]*pos[i]可能为负数,因此统一加上7500,
* 那么初始状态d[0][7500]=1(此时表示天平平衡),表示不用物体且使得天平平衡时的方法只有一种.
*
*
*/

#include
<cstdio>
#include
<cstring>
using namespace std;

const int max1 = 7500, max2 = 50;
int c, g, weigh[max2], pos[max2], d[max2][max1 * 2];


int main(){
scanf(
"%d%d", &c, &g);
for(int i=1; i<=c; i++)
scanf(
"%d", &pos[i]);
for(int i=1; i<=g; i++)
scanf(
"%d", &weigh[i]);

memset(d,
0, sizeof(d));
d[
0][max1] = 1;
for(int i=1; i<=g; i++){
for(int j=0; j<=max1*2; j++)
for(int k=1; k<=c; k++)
d[i][j]
+= d[i-1][j - weigh[i]*pos[k]];

}

printf(
"%d\n", d[g][max1]);

return 0;
}

你可能感兴趣的:(poj)