算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m
轉(zhuǎn)載請注明原文出處:http://blog.csdn.net/baidu_37107022/article/details/75125846
Q題目
編程求解
輸入兩個(gè)整數(shù) n 和 m,從數(shù)列1,2,3…….n 中隨意取幾個(gè)數(shù), 使其和等于 m ,要求將其中所有的可能組合列出來.
Answer解法
這道題就是一道典型的動(dòng)態(tài)規(guī)劃問題了,思路和背包問題差不多,m就相當(dāng)于背包能容納的重量了,就是從右往左校驗(yàn),通過m,以及m-n進(jìn)行下一次計(jì)算。
2.1 邏輯分析
首先判斷,如果n>m,則n中大于m的數(shù)不可能參與組合,此時(shí)置n = m;
將最大數(shù)n加入且n == m,則滿足條件,直接輸出;
將n分兩種情況求解
(1)n沒有加入,取n = n-1; m = m;遞歸下去
(2)n加入,取n = n-1, m = m-n,遞歸下去
當(dāng)前是 : printList( m , n )
遞歸下一層是 : printList( m , n-1 ) 和 printList( m-n , n-1 )
printList(m,n)=printList(m,n?1)+printList(m?n,n?1);
終止條件:n<=0,以及m<0(m<0說明在上一次遞歸調(diào)用是減的n,結(jié)果減多了,所以為負(fù)),m==0時(shí)候說明正好找到,打印
2.2代碼實(shí)現(xiàn)
package 中興面試;import java.util.ArrayList; import java.util.List;/*** 2010 年中興面試題 編程求解: 輸入兩個(gè)整數(shù) n 和 m,從數(shù)列1,2,3.......n 中隨意取幾個(gè)數(shù), 使其和等于 m* ,要求將其中所有的可能組合列出來.*/ public class Test {public static void main(String[] args) {int n = 7;int m = 8;List<Integer> list = new ArrayList<>();// 1.首先判斷,如果n>m,則n中大于m的數(shù)不可能參與組合,此時(shí)置n = m;int up = n > m ? m : n;printList(m, up, list);}/*** * @param m* 要求滿足的和sum* @param n* 取數(shù)的范圍scope* @param list* 每一種滿足條件的組合*/public static void printList(int m, int n, List<Integer> list) {// m=0時(shí),即背包剛好裝滿,打印并退出if (m == 0) {System.out.println(list);return;}// 根據(jù)題意,可知m和n必須為正整數(shù),所以m和n為負(fù)數(shù),或n=0時(shí),直接退出if (n <= 0 || m < 0) {return;}// 拿到上一次計(jì)算的結(jié)果listList<Integer> list1 = new ArrayList<Integer>(list);// n沒有加入printList(m, n - 1, list);// n加入list1.add(n);printList(m - n, n - 1, list1);} }測試結(jié)果:
若不懂動(dòng)態(tài)規(guī)劃算法,可參考http://blog.csdn.net/baidu_37107022/article/details/73188963
總結(jié)
以上是生活随笔為你收集整理的算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【版本工具】Git-浅谈git命令
- 下一篇: 【版本工具】cvs,svn,git等版本