정수 분할[가능한 모든 분할을 일괄 인쇄]

정수 n을 제시하여 이 정수를 가능한 모든 분할합니다. 예를 들어 다음과 같습니다.
4
4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
4=4
5

n=4를 입력하면 두 번째 줄부터 여섯 번째 줄까지 다섯 가지 구분이 있습니다. 분할은 위와 같습니다.
코드는 다음과 같습니다.
#include
#include
#include
using namespace std;
int n,total=0;
int a[100] = {1};
void print(int t) // 
{
    total ++ ; // 
    printf("%d=",n);
    for(int i=1;i<=t;i++)
    {
        if(i==t)
            printf("%d
",a[i]); else printf("%d+",a[i]); } } void solve(int s,int t) { for(int i=a[t-1];i<=s;i++) { if(i<=n) // i 1 , n { a[t] = i; // i s -= i; //s i,s if(s==0) // , print(t); else solve(s,t+1); // s += i; // , , } } } int main() { scanf("%d",&n); solve(n,1); printf("%d
",total); return 0; }

그러나 귀속은 매우 시간을 소모한다. 특히 n이 비교적 클 때 그 문제는 hduoj1028http://acm.hdu.edu.cn/showproblem.php?pid=1028그래서 우리는 새로운 방법을 다시 찾아야 한다. 책에서 모함수가 있는 방법을 언급한 적이 있다. 아래에 코드를 제시하면 코드가 정말 공교롭다. 어쩔 수 없이 알고리즘은 정말 재미있다.
#include
#include
using namespace std;
int c1[125];
int c2[125];
int main()
{
    int n,i,j,k;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<=n;i++)
        {
            c1[i]=1;
            c2[i]=0;
        }
        for(i=2;i<=n;i++)
        {
            for(j=0;j<=n;j++)
            {
                for(k=0;j+k<=n;k+=i)
                  c2[j+k]+=c1[j];
            }
            for(j=0;j<=n;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        cout<

좋은 웹페이지 즐겨찾기