a981

輸入說明 :

n m (1<=n<=30, 1<=m<=100000000)

n個正整數, 全部以空格分開

輸出說明 :

其和剛好等於m的數, 如果有多組解則按由小到大全部印出, 如果無解則印出-1

Cn取m的寫法

要練習一下,在開始窮舉之前先把資料排序,這樣結果就會是對的了

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
int c[30];  //放種類 
int s[30];    //放答案 
int sum;
int flag=0;

void recursive(int N,int n,int t,int total) //幾種,遞迴,金額 
{
    int i;

    if(total>t) return;
    if(n==N)
    {    
        sum=0;

        for(i=0;i<N;i++)
            if(s[i])
            {
                sum+=c[i];
            }

        if(sum==t)
        {
            for(i=0;i<N;i++)
                if(s[i])
                {
                    printf("%d ",c[i]);
                }
            flag=1;
            puts("");
        }

        return ;    
    }    

    s[n]=1;
    total+=c[n];
    recursive(N,n+1,t,total);
    total-=c[n];

    s[n]=0;
    recursive(N,n+1,t,total);
}

int main()
{
    int N;
    scanf("%d",&N);    

    int t;
    scanf("%d",&t);

    int i;
    int j,temp;

    for(i=0;i<N;i++)
        scanf("%d",&c[i]);

    std::sort(c,c+N);

    puts("");

    recursive(N,0,t,0);

    if(flag==0)
        printf("-1\n");
}