描述
給定整數a1、a2、.......an,判斷是否可以從中選出若干數,使它們的和恰好為k。
輸入
首先,n和k,n表示數的個數,k表示數的和。
接著一行n個數。
(1<=n<=20,保證不超int範圍)
輸出如果和恰好可以為k,輸出「yes」,並按輸入順序依次輸出是由哪幾個數的和組成,否則「no」
樣例輸入
4 13樣例輸出1 2 4 7
yes**小生思路: 遞迴乙個乙個資料的試探,(注意有可能會跳過其中的乙個兩個,所以不一定是連續在一起的數字,也不一定是從第乙個開始的)2 4 7
我們需要另外乙個標記數字,用來表示我們的輸出的情況,詳細解釋見**(非最優,很費時)
#include #include #include using namespace std;
int num[22];
bool numisused[22];
bool flag ;
int n,k;
void dfs(int n,int sum)//n表示當前的第幾個數字,sum表示當前的總和
{ if(flag==true)//這個標記表明我們已經找到我們需要的答案了,跳出多餘的迴圈
return ;
int i;
if(n==n || sum<=0)//遞迴出口 ,當sum<=0的時候我們就退出,但是 只有sum==0的時候我們才輸出
{ if(sum==0)
{ cout>k)
{ flag = false;//初始化標記
for(int i=0;i>num[i];
memset(numisused,0,sizeof(numisused)); //初始化標記陣列
dfs(0,k);
if(flag == false)
cout<
優化後時間的對比,
下面是純**
#include #include #include using namespace std;
int num[22];
bool numisused[22];
bool flag ;
int n,k;
void dfs(int n,int sum)
{ if(flag==true)
return ;
int i;
if(n==n || sum<=0)
{ if(sum==0)
{ cout>k)
{ flag = false;
for(int i=0;i>num[i];
memset(numisused,0,sizeof(numisused));
dfs(0,k);
if(flag == false)
cout<
nyoj1058 部分和問題
部分和問題 時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述給定整數a1 a2 an,判斷是否可以從中選出若干數,使它們的和恰好為k。輸入首先,n和k,n表示數的個數,k表示數的和。接著一行n個數。1 n 20,保證不超int範圍 輸出如果和恰好可以為k,輸出 yes 並按輸入...
nyoj 1058 部分和問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給定整數a1 a2 an,判斷是否可以從中選出若干數,使它們的和恰好為k。輸入 首先,n和k,n表示數的個數,k表示數的和。接著一行n個數。1 n 20,保證不超int範圍 輸出如果和恰好可以為k,輸出 yes 並按輸入順序依次...
NYOJ 1058 部分和問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給定整數a1 a2 an,判斷是否可以從中選出若干數,使它們的和恰好為k。輸入 首先,n和k,n表示數的個數,k表示數的和。接著一行n個數。1 n 20,保證不超int範圍 輸出如果和恰好可以為k,輸出 yes 並按輸入順序依次...