ZOJ1711

来源:互联网 发布:大数据方案 编辑:程序博客网 时间:2024/06/05 19:38

 题意:给出一个数n 和a1....ak  问这k个数有多少种相加为n的方法,不能重复

题解:DFS记录答案,暴力判重

#include<bits/stdc++.h>using namespace std;int n,m;int ans,f[2000][20],tem[20];vector<int>a;void dfs(int sum,int k,int num){    if (sum==n || k==m )    {        if (sum==n)        {            ans++;            for (int i=1;i<=num;i++)                f[ans][i]=tem[i];            f[ans][0]=num;        }        return;    }    if (sum+a[k]<=n)    {        tem[num+1]=a[k];        dfs(sum+a[k],k+1,num+1);    }    dfs(sum,k+1,num);}void Gao(){    memset(f,0,sizeof(f));    memset(tem,0,sizeof(tem));    a.clear();    ans=0;    for (int i=0;i<m;i++)    {        int x;        cin>>x;        a.push_back(x);    }    sort(a.begin(),a.end());    m=a.size();    reverse(a.begin(),a.end());    dfs(0,0,0);    if (ans==0)    {        cout<<"NONE"<<endl;        return ;    }    else    {        for (int i=1;i<=ans;i++)        {            bool ok=true;            for (int j=1;j<i;j++)            {                bool same=true;                if (f[i][0]!=f[j][0])                    continue;                for (int k=1;k<=f[i][0];k++)                {                    if (f[i][k]!=f[j][k])                        same=false;                }                if (same)                    ok=false;            }            if (ok)            {                for (int k=1;k<=f[i][0];k++)                    printf(k==1?"%d":"+%d",f[i][k]);                cout<<endl;            }        }    }}int main(){    while (cin>>n>>m &&n)    {        printf("Sums of %d:\n",n);        Gao();    }    return 0;}


0 0
原创粉丝点击