poj 1837 Balance(多重揹包)
阿新 • • 發佈:2022-03-07
題目摘要:輸入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; }