NYOJ 1058部分和問題

2021-07-15 19:42:41 字數 1491 閱讀 1926

描述

給定整數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 並按輸入順序依次...