1. 程式人生 > >19. 中興面試題:輸入兩個整數n和m, 從數列1,2,...,n中任意選擇幾個數,使其和等於m, 要求編寫程式輸出所有的組合

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

2010年中興面試題程式設計求解:輸入兩個整數 n m,從數列123.......n隨意取幾個數,

使其和等於 m ,要求將其中所有的可能組合列出來.

分析:

可以使用遞迴思想, 從第n個數開始找其組合,

1)包括n的所有組合

2)不包括n的所有組合

把所有組合整合起來就OK了。

下面來看具體的實現:

#include<iostream>
#include<vector>
#include<set>
#include<math.h>
using namespace std;

void Getmsets(int n, int m, vector<vector<int> >&allsets)
{
	if(n < 1 || m < 1) return;
	if(m > n*(n+1)/2) return;//n too small
	if(n > m)
		n = m;
	vector<int> _vecset;
	if(n == m)
	{
		_vecset.push_back(n);
		allsets.push_back(_vecset);
		Getmsets(n-1, m, allsets);
	}
	else
	{
		vector<vector<int> > _vecvecsets;
		//包括n的情況
		Getmsets(n, m -n, _vecvecsets);
		vector<vector<int> >::iterator itvecvec;
		for(itvecvec = _vecvecsets.begin(); itvecvec != _vecvecsets.end(); ++ itvecvec)
		{
			itvecvec->push_back(n);
			allsets.push_back(*itvecvec);
		}
		_vecvecsets.clear();
		//不包括n的情況
		Getmsets(n-1, m, _vecvecsets);
		for(itvecvec = _vecvecsets.begin(); itvecvec != _vecvecsets.end(); ++ itvecvec)
		{
			allsets.push_back(*itvecvec);
		}
	}
} 

int main()
{
	
	vector<vector<int> > vecvecres;
	Getmsets(10, 10, vecvecres);
	cout << "n = 10, m = 10, 所有的組合為:" << endl;
	vector<vector<int> >::iterator itvecvec;
	for(itvecvec = vecvecres.begin(); itvecvec != vecvecres.end(); ++ itvecvec)
	{
		for(vector<int>::iterator itvec = itvecvec->begin(); itvec != itvecvec->end(); ++itvec)
		{
			cout << *itvec << ",";
		}
		cout << endl;
	}
	return 0;
}

輸出結果為:

n = 10, m = 10, 所有的組合為:
10,
1,9,
2,8,
3,7,
1,2,7,
4,6,
1,3,6,
5,5,
1,4,5,
2,3,5,
2,4,4,
3,3,4,
1,2,3,4,

相關推薦

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

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

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

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

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

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

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

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

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

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

Python學習 - 試題交換數字

# coding: utf-8 # 面試題:交換兩個數字 a = 6 b = 100 # solution 1 # c = a # a = b # b = c # solution 2 # a = a + b # b = a - b # a = a - b # solution

一道試題比較集合是否相等?

先宣告:本文內容是偏向於應用開發的,分析解答過程不適用於純演算法研發崗位。 朋友小P近來參加某網際網路公司的電話面試,被問到一道題:怎麼判斷兩個集合是否相等?注意,這是面試官的原話,一字不多,一字不少。 小P迅速回答道用雜湊,對方在電話裡也沒有要求給出具體的解決方案,就

劍指Offer試題31.連結串列的第一公共節點

一、題目:兩個連結串列的第一個公共節點 題目:輸入兩個連結串列,找出它們的第一個公共結點。   連結串列結點定義如下,這裡使用C#語言描述: public class Node { public int key; public Node

試題輸入整數ab,然後分別將他們的數字按照高位在右邊的 方式反轉後求和!

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String

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

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

試題輸入一個十進位制整數,將這個數字轉化成對應的十五進位制數(在十五進制,A表示10,B表示11,C表示12,D表示13, E表示14),請寫入轉換程式。例如235表示為10A;

如上是本人一位朋友的公司出的研發小測試,小朋友是一臉懵逼啊! 分析:進位制轉換思路:10進位制除以15商和餘數,反覆拿商除以15獲得商和餘數,類推,知道商為0,停止; 以235表示為10A為例分析: 235/15 = 15 餘數10 15/15 = 1 餘數

11. 微軟試題輸入一個單向連結串列,輸出該連結串列倒數第k結點。連結串列的倒數第0結點為連結串列的尾指標

題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。 分析: 單鏈表只能向後遍歷,不能向前遍歷,尾指標好找,倒數第K個不能從尾指標向前找。 倒的不好找,正的好找,我們只需要知道連結串列的總長度,就可以知道正數第幾個節點(

一箇中興的試題輸入個數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的和是否

試題----合並有序數組

合並 printf 面試 有序數組 color merge set ++ style #include<stdio.h> #include<string.h> #include<stdlib.h> void merge(int a[]

試題9-用棧來實現一個隊列,完成隊列的PushPop操作

ati import str highlight print row pty 用兩個棧 div 題目 用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。 思路: 一個棧壓入元素,而另一個棧作為緩沖,將棧1的元素出棧後壓入棧2中

試題9-用棧來實現一個佇列,完成佇列的PushPop操作

題目 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路: 一個棧壓入元素,而另一個棧作為緩衝,將棧1的元素出棧後壓入棧2中 程式碼  import java.util.Stack;

【劍指offer】試題9:用棧實現佇列【C++版本】

題目: 用兩個棧實現佇列 用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個成員函式,分別完成在佇列尾部插入節點和在佇列的頭部刪除節點 class solution { public: void push(int node);

Python 經典試題: a,b序列,大小都為n,序列元素的值任意整形數,無序, 要求: 通過交換a,b的元素,使[序列a元素的]與[序列b元素的]之間的差最小 使

方法: 用隨機數來求出結果 解題思想: 用隨機數隨機出來所有的程式碼排列可能性,在定義次數的時候 定義的次數越大得到的結果越準確. 最終程式碼: import random #有很多方法是把兩個列表合成一個後排序按照一大一小的分配生成兩個列表 #但是這樣是在資

程式6】  題目輸入整數mn,求最大公約數最小公倍數。

在迴圈中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪迴圈的大數,取得的餘數作為下一輪迴圈的較小的數,如此迴圈直到較小的數的值為0,返回較大的數,此數即為最大公約數,最小公倍數為兩數之積除以最大公約數。 import java.util.Scanner;

牛客網線上程式設計專題《劍指offer-試題37》連結串列的第一公共結點

題目連結: 題目描述: 解題思路: 首先遍歷兩個連結串列得到它們的長度,就能知道哪個連結串列比較長,以及長的連結串列比短的連結串列多幾個結點。在第二次遍歷的時候,在較長的連結串列上先走若干步,接著再同時在兩個連結串列上遍歷,找到的第一個相同的結點就是它們的第