輸入兩個整數 n 和 m,從數列1,2,3…….n 中隨意取幾個數,使其和等於 m ,要求將其中所有的可能組合列出來 。
從1-n
找到數字之和等於m,那麼如果我先找到乙個數1,剩下的任務就是在2~m-1
找到求和等於m-1
就夠了。那如果找到第2個數2
求和小於(找到的1+2求和為3
)m,接下來找3,繼續這樣往下找,如果求和大於m則不合適,說明組合不合理,這時候需要退回,說明1-2
組合不合適,這時需要嘗試新的組合比如1-3
反覆如此直到計算結束。
以m=5,n=5
為例,
下面的**來自牛客,作者沒有註明,無法引用(僅修改列印部分)。
#include
#include
using
namespace
std;
void help(int n,int m,vector
&v,int begin)
cout
<<"\n";
}for(int i=begin;i<=m&&i<=n;i++)
}int main()
**中vector作為棧使用用來儲存可用的資料,列印邏輯是碰到m為0的時候列印。
下面是python實現:
def
get_sum
(n,m,l,begin_num):
if m == 0:
for i in l:
print(i,end=" ")
print()
else:
for i in range(begin_num,m+1):
if i<=m and i<=n:
get_sum(n,m-i,l,i+1)
l.pop()
defmain
():# n,m = input().split()
# n = eval(n)
# m = eval(m)
m = 8
n = 10
get_sum(n,m,,1)
if __name__ == '__main__':
main()
演算法筆記8 DFS
1.有n個物品,每個物品都有重量和 在不超過揹包容量v的情況下選出 之和最大,求最大價值maxvalue。思路,每個物品都有2種方法,選擇或不選擇,相當於迷宮的岔路口,遞迴中的遞迴式。而當物品總重量超過揹包容量v,在相當於迷宮中的死胡同,遞迴中的遞迴邊界。通過列舉所有選擇方案,來得出最優解。其中df...
演算法筆記之DFS與 BFS
基本思想 深度優先搜尋 dfs,depth first search 它從某個狀態開始,不斷的轉移狀態直到無法轉移狀態,然後回退到前一步的狀態,繼續轉移到其它狀態,如此不繼重複,直至找到最終的解。寬度優先搜尋 bfs,breadth first search 總是先搜尋距離初始狀態近的狀態,也就是說...
演算法筆記 深度優先搜尋 DFS
深度優先搜尋 depth first search,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...