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