1. 程式人生 > >輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數,使其和等於m,將其所有可能的組合列出來。 回溯求解

輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數,使其和等於m,將其所有可能的組合列出來。 回溯求解

/*
*[email protected] 轉載請註明出處
*問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數,
*使其和等於m,將其所有可能的組合列出來。
*求解思路:(回溯求解)
*回溯法是窮舉法的改進,回溯法通過剪枝來降低窮舉的時間複雜度
*回溯法需要使用陣列空間來記錄解集合
*/
#include <iostream>
#include <cstdio>

using namespace std;

void backTrack(int m,int n,int *x,int pos,int sum,int cur)
{
    if(sum == m)//如果sum==m則遞迴結束,列印組合
    {
        for(int i = 0;i < pos;++i)
        {
            cout<<x[i]<<" ";
        }
        cout<<endl;
    }
    //將數列從當前位置cur向後遍歷到n
    for(int i = cur;i <= n;++i)
    {
        if(sum > m)//剪枝,遞迴結束
            return;
        if(sum < m)//和小於m,繼續遞迴
        {
            x[pos++] = i;
            backTrack(m,n,x,pos,sum+i,i+1);
            pos--;//回溯控制,因為這裡涉及到是否要新增i這個樹節點
        }
    }
}

int main(int args,char ** argv)
{
    int m = 10;//要求的和
    int n = 8;//數列
    int x[n+1];//記錄解空間
    int pos = 0;//記錄x陣列中的位置
    int sum = 0;//求解過程中的和,初始化為0
    backTrack(10,8,x,pos,0,1);//第一次迭代初始化,和初始值為0,數列起始值為1
    getchar();
    return 0;
}
/*
1 2 3 4
1 2 7
1 3 6
1 4 5
2 3 5
2 8
3 7
4 6
*/

相關推薦

輸入整數nm數列123...n隨意個數使等於m所有可能組合出來 回溯求解

/* *[email protected] 轉載請註明出處 *問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數, *使其和等於m,將其所有可能的組合列出來。 *求解思路:(回溯求解) *回溯法是窮舉法的改進,回溯法通過剪枝來降低窮舉的時間複雜度

輸入整數nm數列1,2,3……n隨意個數使等於m 轉載

輸出 -1 pri str spa private 組合 開始 () 題目:編程求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 分析:分治的思想。可以把問題(m,n)拆分(m - n, n -1)和(m, n -

輸入整數nm,1-n隨意個數使等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.遞迴求解 #include<

Java實現輸入整數nm,0-n隨意個數使等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則滿足條件,

輸入整數nm,0-n隨意個數使等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m

演算法--中興面試:輸入整數 n m數列123.......n 隨意個數, 使等於 m

Q題目 程式設計求解 輸入兩個整數 n 和 m,從數列1,2,3…….n 中隨意取幾個數, 使其和等於 m ,要求將其中所有的可能組合列出來. Answer解法 這道題就是一道典型的動態規劃問題了,思路和揹包問題差不多,m就相當於揹包能容納的

輸入整數nm數列123...n隨意個數使等於m所有可能組合出來 遞迴求解

/* *[email protected] 轉載請註明出處 *問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數, *使其和等於m,將其所有可能的組合列出來。 *求解思路:(遞迴求解) *(1)如果n>m則數列中>m的部分不可能參與組

程式設計求解輸入整數nm,數列1,2,3……n隨意個數使等於m要求所有可能組合列出來(揹包問題求解) .

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則

輸入整數 n m數列123.......n 隨意個數

問題描述:輸入兩個整數n和m,從數列1,2.......n中隨意取幾個數,使其和等於m,要求將其中所有的可能組合列出來。 思路:這個問題其實揹包問題的變形,本文給出兩種解法。       解法一:用遞迴,效率可能低了點。假設問題的解為F(n, m),可分解為兩個子

《已測試通過》輸入整數 n m數列123.......n 隨意個數,使等於m ,要求其中所有可能組合出來並且按每個組合的字典序排列輸出,每行輸出一種組合

參考網上很多,瑪德都不測試的嗎?就貼出來了?浪費時間。網際網路精神在哪!!! import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; import java.util.Scanne

輸入整數 n m數列123.......n 隨意個數,使等於 m ,要求其中所有可能組合出來.

這道題的思路參考0-1揹包:定義函式F(n,m)來求解這個問題,那麼F(n,m)可以分解為兩個子問題F(n-1,m)和F(n-1,m-n).由於題目要求列出所有的組合,使用類似動態規劃的方法比較複雜,我在這裡直接使用遞迴來解決這個問題。雖然效率可能不是很好,但是程式碼的可讀

輸入整數n m數列123.......n 隨意個數, 使等於m ,要求其中所有可能組合出來

中興面試題之一,難度係數中。 題目描述如下:輸入兩個整數n 和m,從數列1,2,3.......n 中隨意取幾個數, 使其和等於m ,要求將其中所有的可能組合列出來。 邏輯分析: 1、比起微軟,google,百度這些公司,中興的面試題還是略顯逗比的,並非是說難度上差異,而是

一箇中興的面試題輸入個數nm數列1,2,3……n隨意個數使等於m要求其中所有組合列出來程式設計求解(c語言遞迴函式分解法)

原題目:輸入兩個數n和m,從數列1,2,3……n中隨意取幾個數,使其和等於m,要求將其中所有組合列出來程式設計求解 c語言解法分析:            先判定n和m的大小,如果m小於n,則只需從1,2……m之間找出和為m的組合即可,如果m大於n,則需要判斷1~n的和是否

1nn整數連續異或的值(1 xor 2 xor 3 ... .. xor n)

。。 nbsp 異或 == ... n) 暴力 bsp 連續 暴力推,前12個數如下: 1 3 0 4 1 7 0 8 1 11 0 12 。。。。 所以對於任意的 n 有如下結論: if : n % 4 == 1 ans

解題筆記(31)——數列1,2...n隨意個數使等於m

      問題描述:輸入兩個整數n和m,從數列1,2.......n中隨意取幾個數,使其和等於m,要求將其中所有的可能組合列出來。 思路:這個問題其實揹包問題的變形,本文給出兩種解法。       解法一:用遞迴,效率可能低了點。假設問題的解為F(n, m),

輸入整數mn及另一個整數k計算m/n結果精確到小數點後k位

#include<stdio.h> int main() { int m,n,k,i; printf("Please input integer m , n and k\n"); scanf("%d%d%d",&m,&n,&k); pri

19. 中興面試題:輸入整數nm, 數列1,2,...,n任意選擇個數,使等於m, 要求編寫程式輸出所有組合

2010年中興面試題程式設計求解:輸入兩個整數 n 和 m,從數列1,2,3.......n中隨意取幾個數, 使其和等於 m ,要求將其中所有的可能組合列出來. 分析: 可以使用遞迴思想, 從第n個數開始找其組合, 1)包括n的所有組合 2)不包括n的所有組合 把所有組

輸入整數要求輸出其中值較大者要求用函數來找大數

數字 9.png 圖片 bsp gpo tdi 小數 .com 輸入 /* p176 例7.2 輸入兩個整數,要求輸出其中值較大者。要求用函數來找大數。 (1)函數名:應是見名知意,反應函數的功能,今定名為max (2)函數的類型:由於給定的兩個數是整數,顯然其中

輸入整數求他們相除的餘數用帶參的巨集來實現程式設計序

import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanne

輸入兩個整數序列第一序列表示棧的壓入順序請判斷第二序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序序列4,5,3,2,1是該壓棧序列對應

    輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應     import java