走進遞迴 湊數字題解

2021-09-09 08:00:45 字數 1344 閱讀 3416

題目描述

有n個數字,a[1],a[2],a[3]......a[n],以及乙個數字m。

問n個數字中取出一些數字,這些數字的和能否等於m。

輸入多組測試資料,讀入到檔案尾結束。

第一行輸入n,m。(1<=n<=20, 1<=m<=100)

第二行輸入n個數字a[1],a[2],a[3]......a[n]。(1<=a[i]<=100)

輸出如果可以,輸出yes,否則輸出no。

樣例輸入

5 51 1 1 1 1

5 52 2 2 2 2

樣例輸出

yesno

解決這題的話我們可以觀察一下規律:

乙個數--兩種結果值組合(n的輸入為1,m和a[i]不是很重要,咱們討論的是如何歸納出公式)_

sum1=a[0]*1=a[0]

sum2=a[0]*0=0

兩個數--四種結果組合

sum1=a[0]*1+a[1]*1=a[0]+a[1]

sum2=a[0]*1+a[1]*0=a[0]

sum3=a[0]*0+a[1]*0=0

sum4=a[0]*0+a[1]*1=a[1]

三個數、四個數我就不寫了,也是這種規律

仔細看看,我們讓a[i]乘1能得到a[i],乘0的話能得到0,正好是我們要不要這個數參與我們的值運算要求。

總結:sumn=a[0]*b[i]+...+a[i]*b[i](b[i]的值要麼就是0,要麼就是1)

從上面的分析我們可以總結出sumn的公式,那麼能不能用for迴圈去計算這些值呢,如果用for迴圈去計算的話,我們可能得弄出個數表來儲存b[i]的值,b有好多種排列,比如兩個數的話,b這個陣列可以為00,01,10,11,這樣就很多了,其實就是計算排列什麼的,最後把這些排列儲存到乙個二維陣列中,通過這個二維陣列來for迴圈遍歷計算,其實這樣計算的話時間複雜度是o(2的n次方),主要是計算排列這一塊。用for迴圈也可以做,但是這裡我就不說了。

說說正題:

讓我們來用遞迴去做吧。最主要的就是遞迴函式這一塊的編寫。

int digui(int j)

c語言版本:

#include const int m=10000;

int n,m,a[m],b[m],ok;

int digui(int j)

if(j==n)return 0;

for(int i=0;i>n>>m;

for(int i=0;i>a[i];

fun(0,0);

cout<<(ok?"yes":"no")

}

湊數字遊戲

problem description 金牌大圖神的演算法能力最近又有不少提高 為了杭電acm集訓隊的可持續性發展,現在他幫忙出了一道題目來訓練新隊員 給出4種數字583,1643,3233,5989,依次分別有n,m,k,g個,請找出用這些數字能湊成的和最接近l的數,如果有2個同樣接近的,請輸出較...

牛牛湊數字

題目 牛牛今天家裡要來客人,所以牛牛今天特意做了他最拿手的兩種蛋糕,但是他是乙個有潔癖的人,所以他在分蛋糕時,有如下幾個原則 1.他不希望乙個盤子裡出現兩種蛋糕 2.他希望每個盤子中都有蛋糕 3.他想讓裝有最少蛋糕數量的盤子中裝有的蛋糕數量盡可能多 示例1複製 5,2,3複製 1只有一種方法把蛋糕分...

簡單遞迴入門題 1 湊數字

有n個數字,a 1 a 2 a 3 a n 以及乙個數字m。問n個數字中取出一些數字,這些數字的和能否等於m。多組測試資料,讀入到檔案尾結束。第一行輸入n,m。1 n 20,1 m 100 第二行輸入n個數字a 1 a 2 a 3 a n 1 a i 100 如果可以,輸出yes,否則輸出no。5 ...