日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載請(qǐng)注明原文出處:http://blog.csdn.net/baidu_37107022/article/details/75125846

Q題目

編程求解

輸入兩個(gè)整數(shù) n 和 m,從數(shù)列1,2,3…….n 中隨意取幾個(gè)數(shù), 使其和等于 m ,要求將其中所有的可能組合列出來(lái).


Answer解法

這道題就是一道典型的動(dòng)態(tài)規(guī)劃問(wèn)題了,思路和背包問(wèn)題差不多,m就相當(dāng)于背包能容納的重量了,就是從右往左校驗(yàn),通過(guò)m,以及m-n進(jìn)行下一次計(jì)算。

2.1 邏輯分析

  • 首先判斷,如果n>m,則n中大于m的數(shù)不可能參與組合,此時(shí)置n = m;

  • 將最大數(shù)n加入且n == m,則滿足條件,直接輸出;

  • 將n分兩種情況求解

    (1)n沒(méi)有加入,取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說(shuō)明在上一次遞歸調(diào)用是減的n,結(jié)果減多了,所以為負(fù)),m==0時(shí)候說(shuō)明正好找到,打印

    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* ,要求將其中所有的可能組合列出來(lái).*/ 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沒(méi)有加入printList(m, n - 1, list);// n加入list1.add(n);printList(m - n, n - 1, list1);} }

    測(cè)試結(jié)果:

    若不懂動(dòng)態(tài)規(guī)劃算法,可參考http://blog.csdn.net/baidu_37107022/article/details/73188963

    總結(jié)

    以上是生活随笔為你收集整理的算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。