1. 程式人生 > >整數分解成若干項之和(DFS)拓展延伸

整數分解成若干項之和(DFS)拓展延伸

在深度優先搜尋的例題中,有一種題型是整數分解成若干項之和。
例如將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=1+6,7=2+5,7=1+1+5,…。程式設計求出正整數N的所有整數分解式子。
這類題就是用了一般的深搜解法

#include<cstdio>
int a[10];
int n,top=-1,sum=0;
void dfs(int i)
{
    if(sum==n)
    {
        printf("%d=",n);
        for(int j=0;j<top;j++)
            printf("%d+",a[j]);
        printf
("%d\n",a[top]); return; } if(sum>n) return; for(int k=i;k<=n;k++) { a[++top]=k; sum+=k; dfs(k); sum-=k; top--; } } int main() { scanf("%d",&n); dfs(1); return 0; }

若此題換一種問法,也是求整數的若干項之和,但加了一個條件,若干項中不可有重複項。此時便需要在dfs函式中額外加個引數,此時,i表示項數之和,m表示有幾項,程式碼如下

#include<cstdio>
int a[1000];
int n;
void dfs(int i,int m)
{
    if(i==n)
    {
        printf("%d=",n);
        for(int j=0;j<m-1;j++)
            printf("%d+",a[j]);
        printf("%d\n",a[m-1]);
        return;
    }
    if(i>n)
        return;
    for(int k=i+1;k<=n;k++)
    {
        a[m
]=k; dfs(i+k,m+1); } } int main() { scanf("%d",&n); dfs(0,0); return 0; }

小白還是菜鳥一枚,哪有不足,望大佬們批評指正。

相關推薦

整數分解若干之和DFS拓展延伸

在深度優先搜尋的例題中,有一種題型是整數分解成若干項之和。 例如將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=1+6,7=2+5,7=1+1+5,…。程式設計求出正整數N的所有整數分解式子。 這類題就是用了一般的深搜解法 #inclu

7-1 整數分解若干之和20 分dfs

思路:不帶標記的dfs,只要沒有超過和就不斷dfs直到超過了之後向前回溯。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math

PTA7-37 整數分解若干之和20 分超級詳解

將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。輸入格式:每個輸入包含一個測試用例,即正整數N (0<N≤30)。輸出格式:按遞增順序輸出N的所有整數分解式子。遞增順序是指:

7-37 整數分解若干之和20 分

題目連結(組合版):點選開啟連結題目大意:略。解題思路:此方法僅限於輸出組合情況,計數的話會TLE。附加題目(計數版):點選開啟連結AC 程式碼(組合版)#include<bits/stdc++.

PTA 7-12 整數分解若干之和20 分

將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。 輸入格式: 每個輸入包含一個測試用例,即正整數N (0 < N ≤ 30)。 輸出格式: 按遞增順序輸出N的所有整數分解式

整數分解若干之和20 分

將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。 輸入格式: 每個輸入包含一個測試用例,即正整數N

pta 5-37 整數分解若干之和 (遞迴

5-37 整數分解為若干項之和   (20分) 將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。 輸入格式: 每個輸入包含一個測試用例,即正整數N (0<<

遞迴整數分解若干之和

輸入樣例: 7 輸出樣例: 7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2 7=1+1+1+4;7=1+1+2+3;7=1+

(PTA)7-1 整數分解若干之和

題目 將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。 輸入格式: 每個輸入包含一個測試用例,即正整數N (0 輸出格式: 按遞增順

整數分解若干相加的形式

#include<stdio.h> #define MAXN 30 int Terms[MAXN]; int count;//count表示輸出結果數 int N;//被分解的整數 void

5-37 整數分解若干之和

解題思路: 採用了深度優先處理的思想,涉及到了一點點資料結構的知識。如果還沒學到資料結構,也不必擔心。在之前的題目中也可能用到了其它容易實現的資料結構,只是不知道它是資料結構中的內容。資料結構就是把各種各樣的操作、邏輯關係進行分類、總結,從而讓我們更加方便地設計演算法來解決問題。 深度優先演算法用遞迴寫起來

7-37 整數分解若干之和

這題完全毫無頭緒,不看網上的答案,我認為我自己是完全寫不出來的。就算看網上的答案看懂了之後,還是覺得這題的程式碼不屬於自己。滿滿都是不安感。 將一個正整數N分解成幾個正整數相加,可以有多種分解

OpenJudge簡單的整數劃分問題兩種方法DFS(動態規劃0ms),全域性題號7215,已AC

2:簡單的整數劃分問題 總時間限制: 100ms 記憶體限制: 65536kB描述 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=n

有一個正整數N可以分解若干個正整數之和,問如何分解能使這些數的乘積最大?

著作權歸作者所有。 商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 作者:人子立 連結:https://www.zhihu.com/question/30071017/answer/4758474

USTC機試-將正整數分解儘可能多的連續整數之和

程式碼如下:#include<stdio.h> #define N 100 int main(){ int n; int j; printf("請輸入您的整數:"); scan

Android目實戰三十九:Android集Unity3D圖文詳解

jar包沖突 scree pmap module 項目實戰 技術 詳細 應用端 原來 原文:Android項目實戰(三十九):Android集成Unity3D項目(圖文詳解)  需求:   Unity3D 一般用於做遊戲 而且是跨平臺的。原本設計是Android 應用端A

java如何簡單的將一個三位正整數分解三個數

如何 tin info 三位數 new 一個 http tint sys 1 public class Leet { 2 public static void main(String[] args) { 3 Scanner scanner =

求Sn=a+aa+aaa+aaaa+aaaaa的前5之和a是一個數字

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void main() { int a, i; int b = 0; int Sn = 0; //用來放每次累加的數值

51nod 1383 整數分解為2的冪數列,也可以自己根據觀察找規律推理得到遞推公式

描述: 組合數學生成函式 1383 整數分解為2的冪 1 秒   131,072 KB   80 分   5 級題 任何正整數都能分解成2的冪,給定整數N,求N的此類劃分方法的數量!由於方案數量較大,輸出

整數劃分並輸出DFS

問題描述:將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整數n的這種表示稱為正整數n的劃分。問題1:輸出整數n的所有可能的劃分,如:輸入:6輸出: 5+1      4+2           4+1+1        3