題目描述
有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 ...