HDU 1709 (母函数)

来源:互联网 发布:单片机应该怎么学 编辑:程序博客网 时间:2024/05/21 17:14

题目链接:点击打开链接

这题颇有意思,与普通的母函数比要考虑减的情况;

代码如下:

#include<iostream>#include<cmath>using namespace std;int c[100005],id[111000],v[101],cz[100005],cf[100005];int main(){c[0]=1;id[0]=0;int n;while (cin>>n){int sum=0;for (int i=0;i<n;i++){cin>>v[i];sum=sum+v[i];}for (int i=1;i<=sum;i++){c[i]=0;//判断能否被得到;cz[i]=0;//判断正数是否被访问;cf[i]=0;//判断负数是否被访问;}int l=1,dl=0;//id数组存储之前可得的重量,包括负数,l是它的长度,dl是他每一次的增量;for (int i=0;i<n;i++){    int di=v[i];    for (int k=0;k<l;k++){    if (id[k]+di>0){    if (cz[id[k]+di]==0){//保证id数组中不存在相同的数;    dl++;    id[l-1+dl]=id[k]+di;    cz[id[k]+di]=1;} c[id[k]+di]=1;}else if (id[k]+di<0){    if (cf[-id[k]-di]==0){//保证id数组中不存在相同的数;    dl++;    id[l-1+dl]=id[k]+di;    cf[-id[k]-di]=1;} c[-id[k]-di]=1;}if (id[k]-di>0){    if (cz[id[k]-di]==0){//保证id数组中不存在相同的数;    dl++;    id[l-1+dl]=id[k]-di;    cz[id[k]-di]=1;} c[id[k]-di]=1;}else if (id[k]-di<0){    if (cf[-id[k]+di]==0){//保证id数组中不存在相同的数;    dl++;    id[l-1+dl]=id[k]-di;    cf[-id[k]+di]=1;} c[-id[k]+di]=1;}}l=l+dl;//更新id数组的长度;dl=0;    }int count=0;for (int i=1;i<=sum;i++){if (c[i]==0)count++;}cout<<count<<endl;count=0;for (int i=1;i<=sum;i++){if (c[i]==0){if (count)cout<<' ';cout<<i;count=1;}}if (count)cout<<endl;}return 0;}

原创粉丝点击