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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法题放苹果:把M个相同的苹果放到N个完全相同的盘子里,有多少种放法?

發布時間:2024/5/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法题放苹果:把M个相同的苹果放到N个完全相同的盘子里,有多少种放法? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 題解
  • 思路1 暴力遞歸
  • 思路2:緩存思想——動態規劃來優化暴力遞歸

題目描述


鏈接:點我做題

題解

思路1 暴力遞歸

??我們利用遞歸來解決這個問題,不妨這樣思考,假設apples表示當前剩余的蘋果數,plates表示當前剩余的盤子數,ways(apples, plates)表示以apples個蘋果放進plates個盤子里的方法數。
??如果apples==0,說明當前蘋果都已經放完了,既然放完了,不管剩不剩盤子,這都是一種放的方法,向上一層返回1;
??否則apples不為0的時候,如果plates==0了,盤子已經被用完了但是蘋果沒放完,這種情況顯然是擺放失敗了,不是一種擺放的方法,向上一層返回0;
??再考慮一種特殊情況,當盤子數大于蘋果數時,那么蘋果怎樣也不可能放到多出來的盤子上,這種情況下的擺放方法數顯然和盤子減少為 p l a t e s ? a p p l e s plates-apples plates?apples個,apples個蘋果的擺放方法數是一樣多的,因此
i f ( a p p l e s < p l a t e s ) , w a y s ( a p p l e s , p l a t e s ) = w a y s ( a p p l e s , p l a t e s ? a p p l e s ) if (apples <plates),\\ways(apples, plates)=ways(apples,plates-apples) if(apples<plates),ways(apples,plates)=ways(apples,plates?apples)
??當剩余的蘋果數量大于盤子數量時,我們有兩種互斥的擺法
??一種,我們用上所有的盤子,也就是先讓所有的盤子都擺上一個蘋果,那么這種方式的擺法數量a顯然等于 w a y s ( a p p l e s ? p l a t e s , p l a t e s ) ways(apples - plates, plates) ways(apples?plates,plates);
??另一種方法,我們不用上所有的盤子,那么怎么才能不用上所有的盤子呢?先放棄一個盤子,剩下的盤子是放棄還是保留交給遞歸來討論。也就是說,不完全使用所有盤子的擺放方法數量b等于 w a y s ( a p p l e s , p l a t e s ? 1 ) ways(apples, plates - 1) ways(apples,plates?1).
??這兩種情況顯然是互斥的,所以他們的方法數可以直接相加,也就是說
i f ( a p p l e s > p l a t e s ) w a y s ( a p p l e s , p l a t e s ) = w a y s ( a p p l e s ? p l a t e s , p l a t e s ) + w a y s ( a p p l e s , p l a t e s ? 1 ) if (apples>plates)\\ ways(apples,plates)=ways(apples-plates,plates)\\+ways(apples, plates-1) if(apples>plates)ways(apples,plates)=ways(apples?plates,plates)+ways(apples,plates?1)
代碼:

int ways(int apples, int plates) {//apples個完全相同的蘋果放到plates個完全相同的盤子里//有多少種方法//如果蘋果用完了 說明擺放結束了 返回一種擺法if (apples == 0) {return 1;}//如果plates等于0了 apples不等于0還 那么說明沒有盤子用了//0種擺法if (plates == 0) {return 0;}//如果盤子數大于蘋果數 那么多出來的盤子不論什么擺法一定空著//這種情況下的擺法數等于把多出來的盤子都不考慮的擺法數if (plates > apples) {return ways(apples, apples);}//當蘋果數大于盤子數的時候 有兩種方法//1) 我們把所有的盤子都使用 那么相當于先往所有盤子上都放一個蘋果// 這種方法的方法數等于ways(apples - plates, plates)int a = ways(apples - plates, plates);//2) 我們讓盤子不全都使用 那么就敲碎一個盤子 //剩下的盤子全用還是敲碎一個 總可能方法數用遞歸去討論int b = ways(apples, plates - 1);//這兩種情況顯然是互斥的 所以數量可以直接加return a + b; }

思路2:緩存思想——動態規劃來優化暴力遞歸

??所有的暴力遞歸的展開過程都可以用動態規劃來優化.我們想想遞歸是怎么解決問題的,比如遇到ways(7, 5),它是展開為ways(7,4)和ways(2,5)來解決的,然后ways(2,5)和ways(7,4)再接著展開,那如果我們之前早就計算過ways(2,5)了呢,如果已經計算過一次了,還有必要再接著展開嗎?直接用上次計算的結果不就好了,這樣不就可以把遞歸層數變淺了嗎。
??那么怎么記錄上次計算的結果呢?這里可以用一個二維數組dp緩存存起來,并且考慮到多組輸入問題,我們可以把創建二維數組dp的過程放到執行ways方法外頭,這樣下一組輸入也可以使用我們上一輪計算過的值。
??為了和0種方法區分,我們不妨先讓dp的所有值都賦-1,表示尚未計算過,在遞歸的每一層都檢查當前層中dp的是否不等于-1,如果是,說明這層沒必要繼續展開下去了,已經計算過了,返回 d p [ a p p l e s ] [ p l a t e s ] dp[apples][plates] dp[apples][plates],否則再執行展開過程,并且最后把這一層的計算結果記錄到dp中作為緩存。

代碼:

#include <vector> #include <iostream> using namespace std; int ways(int apples, int plates, vector<vector<int>>& dp) {if (dp[apples][plates] != -1){return dp[apples][plates];}int ans = 0;if (apples == 0){ans = 1;}else if (plates == 0){ans = 0;}else if (apples < plates){ans = ways(apples, apples, dp);}else{int a = ways(apples - plates, plates, dp);int b = ways(apples, plates - 1, dp);ans = a + b;}dp[apples][plates] = ans;return ans; }int main() {int apples, plates;vector<vector<int>> dp(11, vector<int>(11, -1));while (cin >> apples >> plates){cout << ways(apples, plates, dp) << endl;}return 0; }

總結

以上是生活随笔為你收集整理的算法题放苹果:把M个相同的苹果放到N个完全相同的盘子里,有多少种放法?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲男女激情 | 人妖一区 | 欧美一区二区三区久久成人精品 | 精品久久一区 | 涩涩久久| 天堂8在线天堂资源bt | av操操| 日韩一区二区三区免费在线观看 | 亚洲在线色| 黑人玩弄人妻一区二区三区影院 | 亚洲综合五月 | 成人黄色a级片 | jlzzjlzzjlzz亚洲人 | 亚洲女同视频 | 黄色99 | 色婷婷免费| 色婷婷综合久久久久中文字幕 | 日韩精品一区二区三区四区五区 | 亚洲国产成人一区二区 | 日韩午夜av | 色吧在线视频 | 亚洲图区综合 | 浮力影院草草 | 懂色av一区二区三区四区五区 | 一级激情片| 四虎永久地址 | 成人影视在线播放 | 日韩av在线一区二区 | 免费看国产曰批40分钟粉红裤头 | 国产精品伦一区二区三级视频 | 少妇熟女视频一区二区三区 | 日韩中文字幕免费视频 | 欧美成人一级 | 波多野结衣一区二区三区在线 | 穿越异世荒淫h啪肉np文 | 小明看国产 | www.777色 | 91香蕉嫩草| 少妇高潮喷水在线观看 | 国产三级视频在线播放 | 原来神马电影免费高清完整版动漫 | 18禁裸乳无遮挡啪啪无码免费 | 高清一区二区三区四区五区 | 日韩毛片免费看 | 一区二三区 | 欧美精品四区 | 国产尤物av | 黄色成人免费网站 | 成人三级在线播放 | 中文字幕一区二区三区四区欧美 | 欧美日韩在线视频播放 | 日韩国产一区二区 | 亚洲精品小视频在线观看 | 欧美激情videos | 农村少妇久久久久久久 | 久久久久久久久久久久久女国产乱 | 欧美日韩在线观看一区二区 | 国产动漫av | 草草久久久 | 日韩高清久久 | 日韩一区二区三区av | 亚洲精品无码专区 | 肥婆大荫蒂欧美另类 | 性生活视屏 | 色综合天天干 | 久久久久久久久久久91 | 美女黄页在线观看 | 懂色av中文一区二区三区天美 | 爱上av| 96日本xxxxxⅹxxx17| 兔费看少妇性l交大片免费 日韩高清不卡 | 九九视频在线免费观看 | 白丝少妇| 男生脱女生衣服 | 亚洲第一av网站 | 日韩精品免费视频 | 亚洲国产欧美另类 | 人人看人人射 | 中文字幕www | videos麻豆 | www九色 | 久久亚洲精品小早川怜子 | 国产欧美一区二区三区沐欲 | 欧美色资源 | 精品99视频 | 国产又黄又大又粗视频 | 那个网站可以看毛片 | 欧美日韩国产一级 | 国产女教师一区二区三区 | 午夜精品一区二 | 嫩草嫩草嫩草嫩草嫩草嫩草 | 全黄一级片 | 香蕉视频一级片 | 中国在线观看视频高清免费 | 午夜国产一区二区 | 富二代成人短视频 | 荷兰女人裸体性做爰 | 成人网一区| 日韩一区欧美二区 |