poj 1837 Balance(多重背包)
题目摘要:输入C个天平臂,G个物体,负数为左臂,正数为右臂,问用上所有物体和两条天平臂能使天平平衡的方法有几种。
解析:如果要天平平衡,C[左]*G[左]+C[右]*G[右]=0,即当C[左]*G[左]+C[右]*G[右]>0是天平向右倾斜,<0时向左倾斜,可用发f[i][j]表示选了i个物品,C[左]*G[左]+C[右]*G[右]的值为j。
注意:由于数组下标不能为负,所以以所有物品放到一侧时的最大值7500作为基准,由于我过于谨慎,开到了10000。
代码如下
#include<iostream> #include<stdio.h> #include<stack> #include<string.h> #include<algorithm> #include<queue> #include<string> #include<map> int n,m,c[25],g[25],f[25][21000]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&c[i]); } for(int i=1;i<=m;i++) { scanf("%d",&g[i]); } f[0][10000]=1; for(int i=1;i<=m;i++) { for(int j=0;j<=20000;j++) { for(int k=1;k<=n;k++) { f[i][j+g[i]*c[k]]+=f[i-1][j]; } } } printf("%d\n",f[m][10000]); return 0; }