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");
}