1. 程式人生 > 其它 >poj 1837 Balance(多重揹包)

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; }
人生如逆旅,你我皆行人,只願你我共度這旅途,歸來仍是少年