P2404 自然數的拆分問題c++題解
P2404 自然數的拆分問題
題目描述
任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。現在給你一個自然數n,要求你求出n的拆分成一些數字的和。每個拆分後的序列中的數字從小到大排序。然後你需要輸出這些序列,其中字典序小的序列需要優先輸出。
輸入格式
輸入:待拆分的自然數n。
輸出格式
輸出:若干數的加法式子。
輸入輸出樣例
輸入
7
輸出
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
這就是一個簡單的求各個數求和,問滿足條件的式子有多少個?
道理大家都懂,但是怎麼用程式碼來實現呢,首先我們觀察樣例可以看到拆分的自然數總是大於或者等前一位數,所以我們要定義一個變數來儲存前一個數的資訊,避免重複尋找相同的式子,
當然我們需要知道當前式子之和為多少
以及我們要操作的數是第幾位
並用一個陣列儲存這若干個自然數
void backtrack(int n, int sum, int i, int b[], int qs);
//n為要拆分的數
//sum為式子數的總和
//i為當前操作是第i位數
//b為該若干個數
//qs前一個數的值
然後在進行遞迴就行了,在遞迴的時候我們是從qs開始一直到n-1進行迴圈的,如果超出了n的值就退出遞迴。
#include<bits/stdc++.h>
using namespace std;
void backtrack(int n, int sum, int i, int b[], int qs) {
if(n == sum) { //兩個值相等表示找到了一個這樣的式子
for(int j = 1; j <= i-2; j++) {
cout << b[j] << "+";
}
cout << b[i-1] <<endl;
return ;
}
if(i > n+1) return ; //超出了值退出遞迴
for(int j = qs; j <= n-1; j++) {
b[i] = j;
backtrack(n, sum+j, i+1, b, j);
b[i] = 0;
}
}
int main() {
int n;
int b[10];
cin >> n;
memset(b, 0, sizeof(b));
backtrack(n, 0, 1, b, 1);
}
相關文章
- P2404 自然數的拆分問題
- 洛谷P2404 自然數的拆分問題——題解
- LeetCode-343. 整數拆分 - 題解分析LeetCode
- 簡單的素數問題(C++)C++
- 雙模數問題 題解
- C++的0.3問題C++
- leetcode 整數拆分(c++)LeetCodeC++
- 使用合適的維度拆分來求解問題
- c++使用遇到的問題C++
- 《扶蘇的問題》題解
- 班級問題(c++)C++
- c++ 常見問題C++
- CHOJ 5202 自然數拆分Lunatic版 【完全揹包模型】模型
- java解決數字黑洞問題Java
- Rust 如何解決 C++ 的問題?RustC++
- 機器學習無法解決自然語言理解問題 - thegradient機器學習
- 火星商店問題 題解
- 無題號 分配問題 題解
- 宣告變數的問題變數
- leetcode37 解數獨問題 hardLeetCode
- 怎樣解題|題7.5.12:因數的個數
- 最大數問題
- 怎樣解題|題2.2.29:康威的售票員問題
- 自然語言處理中的分詞問題總結自然語言處理分詞
- c++類迴圈依賴的問題C++
- 括號匹配的檢驗問題(C++)C++
- Just for fun——C/C++函式返回區域性變數的問題C++函式變數
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- oracle 使用nullif解決除數為零的問題OracleNull
- 10款解決數學問題的最佳AI工具AI
- 數值最優化—優化問題的解(二)優化
- c++模板類的使用,編譯的問題C++編譯
- leetcode題解(陣列問題)LeetCode陣列
- 自然語言處理之序列標註問題自然語言處理
- c++求解李白喝酒問題C++
- c++工程師面試問題C++工程師面試
- c++偶現問題備錄C++
- LeetCode刷題記錄與題解(C++版本)LeetCodeC++