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;
}

 

posted @ 2022-03-07 16:34  所见皆为虚妄  阅读(37)  评论(0编辑  收藏  举报