日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

javascript - 算法:給一個數字,求有多少種方法相加等于這個數?

瀏覽:187日期:2023-05-07 08:06:19

問題描述

比如8,可以有 4加4,2加5加1等,共有多少種方式,并列出所有方式集合

問題解答

回答1:

實數無解

負數無解

如果數字的個數一定很簡單,兩個的話枚舉一半即可,多個可以參考下面的算法,修改為固定長度即可

如果數字的個數不一定,則也不能存在 0;參考一下

按公式的長度來遍歷遞歸,因為可以剪枝,效率可觀

function count (num) { if (!(num > 1)) { return [] } var equations = [] var eq = [] for (let len = 2; len <= num; len += 1) { _countByLen(num, eq, 0, len, 0) } return equations function _countByLen (num, eq, i, len, sum) { if (i === len) { if (sum === num) {equations.push(eq.join(’+’)) } return } for (let n = eq[i - 1] || 1; n < num; n += 1) { let newSum = n + sum if (newSum > num) { break } eq[i] = n _countByLen(num, eq, i + 1, len, newSum) } }}count(5) // [’1+4’, ’2+3’, ’1+1+3’, ’1+2+2’, ’1+1+1+2’, ’1+1+1+1+1’]

一開始想到的方式,將 1~n 每個的公式結果緩存起來遞歸,存起來很浪費空間,反復遍歷也很慢

function count (num) { if (!(num > 1)) { return [] } var equations = [,[[1]]] _count(num) return equations[num].slice(0, -1).map(eq => eq.join(’+’)) function _count (num) { if (equations[num]) { return equations[num] } let halfNum = Math.floor(num / 2) let eqNum = [] // 即 equations[num] for (let n = 1; n <= halfNum; n += 1) { _count(num - n).forEach(eq => {if (n <= eq[0]) { eqNum.push([n].concat(eq))} }) } eqNum.push([num]) equations[num] = eqNum return eqNum }}count(5) // ['1+1+1+1+1', '1+1+1+2', '1+1+3', '1+2+2', '1+4', '2+3']回答2:

如果是實數.. 這題沒什么意義

寫個兩兩相加的

這里寫個遞歸把.. 我也只懂一點點遞歸。。

R

var color = ’’; var wow = (n, i = 0) => { if (i > n / 2) return ; else {console.log(`%c ${n} = ${i} + ${n - i} `, color); wow(n, i + 1); }}S

javascript - 算法:給一個數字,求有多少種方法相加等于這個數?

javascript - 算法:給一個數字,求有多少種方法相加等于這個數?

回答3:

無解只是你沒有給足條件,正整數是可以做的。用最簡單的遞歸,時間復雜度是接受不了的。用n=100程序直接就崩了我用的動態規劃,用一個矩陣保存s[i,j]保存對應的結果,這樣就不需要每次都重新算出之前的結果。其中si,j,i=n,以j開頭的組合數量,因為沒有0的情況,所以是s[i,0]我放的是s[i,1]+s[i,2]+...+s[i,j]的結果例如s[5,1],就是表示n=5,1+1+1+1+1,1+1+1+2,1+1+1+3,1+1+1+4,1+2+2,5種情況,其實按照這種方式可以很容易看出s[i,1]=s[i-1,0],故s[i,0]=s[i,1]+s[i,2]+...+s[i,j]s[i,0]=s[i-1,0]+s[i,2]+...+s[i,j]其中我們去掉重復的條件,就只需要計算到s[i,i],s[i,0]=s[i-1,0]+...+s[i,i]由于s[i,i]=1,所以最后只需要計算出s[i,2]+s[i,3]+...+s[i,i-1]的結果由于后來的數的組合方式都可以重之前的組合拼接出來,同s[i,1] = s[i-1,0],s[i,j] = s[i-j,k],其中j > 1, j <= k <= i下面是偽代碼

function(s, n) { s <= {0,0}; for(i = 1 to n)for (j = 1 to floor(i/2) ) if(j = 1) s[i][j] = s[i-1][0] else temp = 0;for(k = j to i) temp += s[i-j][k]s[i][j] = temp s[i][0] += s[i][j]s[i][j] = 1,s[i][0]++ return s}

下面是PHP實現的

function calculate(&$s, $n) { for( $i = 1; $i <= $n; $i++ ) {$s[$i][0] = 0;for( $j = 1; $j <= floor($i/2); $j++ ) { //以1開頭的,等于上一次計算結果 if( $j == 1 ) {$s[$i][$j] = $s[$i - 1][0]; } else {$temp = 0;for ($k = $j; $k <= $i; $k++) { if( isset($s[$i - $j][$k]) ) {$temp += $s[$i - $j][$k]; }}$s[$i][$j] = $temp; } $s[$i][0] += $s[$i][$j];}//對角線,加上自身$s[$i][$i] = 1;$s[$i][0]++; }}

感覺還可以再優化,計算si,j>1的情況可以預先保存之前組合的數量,通過空間換時間。希望對你有幫助

回答4:

這個東西有一個函數叫 拆分函數P我之前做過一個跟這個有關的小算法題 神的90億名字不過我的題目中只需要求出整數拆分的數目,沒有涉及具體的組合,在上面那篇拆分函數P中估計有涉及到

回答5:

這種算法邏輯最好有一定的限定條件,我姑且認為有指定數量的元數字目標數字

Java版本:

import java.util.ArrayList;import java.util.Arrays;class SumSet { static void sum_up_recursive(ArrayList<Integer> numbers, int target, ArrayList<Integer> partial) { int s = 0; for (int x: partial) s += x; if (s == target) System.out.println('sum('+Arrays.toString(partial.toArray())+')='+target); if (s >= target) return; for(int i=0;i<numbers.size();i++) { ArrayList<Integer> remaining = new ArrayList<Integer>(); int n = numbers.get(i); for (int j=i+1; j<numbers.size();j++) remaining.add(numbers.get(j)); ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial); partial_rec.add(n); sum_up_recursive(remaining,target,partial_rec); } } static void sum_up(ArrayList<Integer> numbers, int target) {sum_up_recursive(numbers,target,new ArrayList<Integer>()); } public static void main(String args[]) {Integer[] numbers = {3,9,8,4,5,7,10};int target = 15;sum_up(new ArrayList<Integer>(Arrays.asList(numbers)),target); }}

C#版本:

public static void Main(string[] args){ List<int> numbers = new List<int>() { 3, 9, 8, 4, 5, 7, 10 }; int target = 15; sum_up(numbers, target);}private static void sum_up(List<int> numbers, int target){ sum_up_recursive(numbers, target, new List<int>());}private static void sum_up_recursive(List<int> numbers, int target, List<int> partial){ int s = 0; foreach (int x in partial) s += x; if (s == target)Console.WriteLine('sum(' + string.Join(',', partial.ToArray()) + ')=' + target); if (s >= target)return; for (int i = 0; i < numbers.Count; i++) {List<int> remaining = new List<int>();int n = numbers[i];for (int j = i + 1; j < numbers.Count; j++) remaining.Add(numbers[j]);List<int> partial_rec = new List<int>(partial);partial_rec.Add(n);sum_up_recursive(remaining, target, partial_rec); }}

Ruby版本:

def subset_sum(numbers, target, partial=[]) s = partial.inject 0, :+# check if the partial sum is equals to target puts 'sum(#{partial})=#{target}' if s == target return if s >= target (0..(numbers.length - 1)).each do |i| n = numbers[i] remaining = numbers.drop(i+1) subset_sum(remaining, target, partial + [n]) endendsubset_sum([3,9,8,4,5,7,10],15)

Python版本:

def subset_sum(numbers, target, partial=[]): s = sum(partial) # check if the partial sum is equals to target if s == target: print 'sum(%s)=%s' % (partial, target) if s >= target:return for i in range(len(numbers)):n = numbers[i]remaining = numbers[i+1:]subset_sum(remaining, target, partial + [n]) if __name__ == '__main__': subset_sum([3,9,8,4,5,7,10],15) #輸出: #sum([3, 8, 4])=15 #sum([3, 5, 7])=15 #sum([8, 7])=15 #sum([5, 10])=15

如果給定條件是正數的話,把數組換成1~N。這個邏輯同樣適用負數。

回答6:

這個算法還是比較簡單的如果要分解的數為雙數 比如 18 那么幾乎它的結果會是(18/2+1)種組合 然后第一個數從0開始遞增,第二個數從最大值遞減即可如果為單數 17,那么可以讓它加1后再除以2,又變成(18/2)了,然后第一個數從0開始遞增,第二個數從最大值遞減即可

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产美女精品| 亚洲精品伊人| 亚洲一级网站| 国产伦精品一区二区三区视频| 高清不卡亚洲| 国产精品久久久久av蜜臀| 亚洲一区中文| 中文字幕系列一区| 91精品国产一区二区在线观看| 欧美午夜不卡| 欧美不卡高清一区二区三区| 国产a亚洲精品| 国产精品mv在线观看| 麻豆久久久久久| 精品网站aaa| 久久精品青草| 三级亚洲高清视频| 日韩va欧美va亚洲va久久| 国产精品va视频| 免费高潮视频95在线观看网站| 日韩在线欧美| 五月精品视频| 日韩1区2区3区| 国产精品夜夜夜| 视频二区不卡| 麻豆久久精品| 国产欧美日韩免费观看| а√天堂8资源在线| 久久久成人网| 日韩精品一卡二卡三卡四卡无卡| 欧美一区精品| 日韩免费看片| 亚洲欧美日韩视频二区| 日韩中文字幕在线一区| 久久三级中文| 红桃视频亚洲| 久久精品99国产精品| 成人三级高清视频在线看| 亚洲视频综合| 欧美日韩亚洲一区在线观看| 日本在线高清| 水野朝阳av一区二区三区| 国产精品久久亚洲不卡| 亚洲成人av观看| 亚洲精品在线国产| 日本一二区不卡| 美国欧美日韩国产在线播放| 国产精久久久| 一区免费在线| 欧美精品97| 99国产精品久久久久久久成人热| 91成人精品在线| 久久三级福利| 日本在线成人| 日韩精品欧美激情一区二区| 日韩av黄色在线| 亚洲一级黄色| 美日韩一区二区三区| 99国产精品| 国产不卡一区| 影视先锋久久| 国产亚洲人成a在线v网站| 日韩不卡在线| 国产精品久久久久久久久免费高清 | 国产精品一二| 999国产精品| 国产精品任我爽爆在线播放| 黑丝一区二区| 美腿丝袜在线亚洲一区| 西西人体一区二区| 福利一区和二区| 日本欧美大码aⅴ在线播放| 人人草在线视频| 国产亚洲一区二区三区啪| 狠狠操综合网| 中文字幕人成乱码在线观看 | 日韩欧美中文字幕电影| 成人精品中文字幕| 国产精品调教| 99视频精品| 色综合五月天| 日本麻豆一区二区三区视频| 91久久久精品国产| 国产盗摄——sm在线视频| 欧美日韩xxxx| 美女国产精品| 肉色欧美久久久久久久免费看| 亚洲青青久久| 黄色免费成人| 日韩在线短视频| 久久av导航| 欧美啪啪一区| 日本一不卡视频| 国产视频一区三区| 国产专区一区| 99久久婷婷| 四虎4545www国产精品 | 欧美精品1区| 欧美资源在线| 91精品成人| 91精品一区国产高清在线gif| 精品视频网站| 麻豆精品蜜桃视频网站| 欧美啪啪一区| 欧美久久一区二区三区| 午夜电影一区| 亚洲精品影院在线观看| 美美哒免费高清在线观看视频一区二区 | 国产精品亚洲一区二区在线观看| 蜜臀久久久久久久| 亚洲一区国产| 伊人久久大香线蕉av不卡| 亚洲啊v在线| 国产99在线| 欧美日韩国产观看视频| 国内精品伊人| 精品国产三区在线| 欧美精品91| 精品三级在线观看视频| 国产精品成人自拍| 久久成人福利| 精品美女在线视频| 精品视频一区二区三区在线观看 | 午夜日韩影院| 午夜亚洲福利| 日本va欧美va精品发布| 日韩区一区二| 欧美三区不卡| 国产精品红桃| 国产一区二区三区探花| 黑人精品一区| 99精品电影| 激情欧美一区| 伊人影院久久| 噜噜噜久久亚洲精品国产品小说| 美女国产精品| 日韩av黄色在线| 国产精品三p一区二区| 精品国产一区二区三区性色av| 精品视频国内| 欧美日韩免费观看视频| 久久久久国产| 国产亚洲精品自拍| 亚洲精品福利| 国产激情一区| 亚洲天堂免费电影| 亚洲欧洲一区| 亚洲区欧美区| 99精品在线免费在线观看| 日韩欧美一区二区三区免费看| 久久国产毛片| 男人的天堂久久精品| 91精品一区| 精品亚洲自拍| 伊人精品一区| 涩涩涩久久久成人精品| 久久久久97| 久久久久久黄| 在线精品国产亚洲| 欧美xxxx性| 99久久九九| 亚洲人成网77777色在线播放| 欧美在线观看天堂一区二区三区| 久久精品国产亚洲aⅴ| 日本精品不卡| 四虎国产精品免费久久| 精品视频一区二区三区在线观看| 另类中文字幕国产精品| 中文无码久久精品| 精品美女视频 | 国产欧美在线| 老牛影视精品| 性欧美长视频| 国产精品s色| 五月天久久久| 国产精品99精品一区二区三区∴| 91精品xxx在线观看| 免费成人在线视频观看| 精品精品99| 蜜臀a∨国产成人精品| 国产999精品在线观看| 亚洲免费中文| 日韩不卡一区| 亚洲精品黄色| 色偷偷偷在线视频播放| 亚洲网址在线观看| 国产va免费精品观看精品视频| 久久福利影视| 最新中文字幕在线播放| 亚洲免费资源| 99免费精品| 麻豆精品99| 蜜桃久久av| 欧美香蕉视频| 国产日韩中文在线中文字幕| 蜜臀久久99精品久久一区二区| 日韩精彩视频在线观看| 亚洲性视频h| 久久精品人人| 中文字幕亚洲在线观看|