【母函数初学】The Balance hdoj 1709

The Balance hdoj 1709 (母函数初学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1709
题目大意: 输入N个数,每个只能用一次,输出1到最大(即所有数和)不能称出的重量。
题目思路: 母函数,但这题是比较有思考性的,没有正真理解母函数的应用,一味套模版的人肯定对这题挺困惑,这里相当于每个方程只有三个数【x^(-a)】【1】【x^(a)】,好好想想。

ac代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <string>
using namespace std;
#define N 11000
int c1[N],c2[N];
int a[110],b[N];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int sum = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        for(int i = 0; i <= sum; i++)
        {
            c1[i] = 0;
            c2[i] = 0;
        }
        c1[a[0]] = 1;
        c1[0] = 1;
        for(int i = 1; i < n; i++)
        {
            /*
            for(int i = 0; i < sum; i++)
                printf("%d ",c1[i]);
            printf("%d\n",c1[sum]);
            */
            for(int j = 0; j <= sum; j++)
            {
                c2[j] += c1[j];
                c2[j+a[i]] += c1[j];
                if(j-a[i] >= 0)
                    c2[j-a[i]] += c1[j];
                else
                    c2[a[i]-j] += c1[j];
            }
            for(int j = 0; j <= sum; j++)
            {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
        int x = 0;
        int f = 0;
        for(int j = 0; j <= sum; j++)
        {
            if(c1[j] == 0)
            {
                x++;
                b[f++] = j;
            }
        }
        printf("%d\n",x);
        if(x)
        {
            for(int i = 0; i < f-1; i++)
                printf("%d ",b[i]);
            printf("%d\n",b[f-1]);
        }
    }
    return 0;
}

这里有段注销的代码,如果对这代码不太清楚,可以把注释输出到屏幕,显示的是数组的变化过程(不过这里最后一步的变化没显示)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值