m个苹果放入n个盘子问题
題目:
把M個同樣的蘋果放在N個同樣的盤子里,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。
輸入
每個用例包含二個整數M和N。0<=m<=10,1<=n<=10。0<=n<=10<=m<=10
解題思路:
我們首先定義dp[i][j]表示i個蘋果,j個盤子的分法總數
1.當盤子數多于蘋果數時:則必定有j-i個盤子是空著的。
dp[i,j] = dp[i,i];
2.當盤子數少于蘋果數時(j<=i):
又分兩種情況:
<1>當有空盤子時:即至少有一個盤子是空的:dp[i][j] = dp[i][j-1];
<2>沒有空盤子時:即所有的盤子都有蘋果,從每個盤子里拿掉一個蘋果對結果沒有影響:dp[i][j] = dp[i-j][j];
因此所有可能的情況為dp[i][j] = dp[i][j-1]+dp[i-j][j];
初始化:
我們知道當i=0時,也就是蘋果為0,只有一種放法,當j=1時,也就是盤子為1,只有一種放法。
代碼如下:
#include <iostream> using namespace std; const int N = 1010; int n, m; int dp[N][N];int main() {cin >> n >> m; //n個蘋果,m個盤子for (int i = 0; i <= m; i++)dp[0][i] = 1;for (int i = 0; i <= n; i++)dp[i][1] = 1;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (i < j) {dp[i][j] = dp[i][i];} else if (i >= j) {dp[i][j] = dp[i][j - 1] + dp[i - j][j];}}cout << dp[n][m] << endl;return 0; }現在試試下面這道題,嘿嘿嘿!!!
題目:
在火影忍者的世界里,令敵人捉摸不透是非常關鍵的。
我們的主角漩渦鳴人所擁有的一個招數——多重影分身之術——就是一個很好的例子。
影分身是由鳴人身體的查克拉能量制造的,使用的查克拉越多,制造出的影分身越強。
針對不同的作戰情況,鳴人可以選擇制造出各種強度的影分身,有的用來佯攻,有的用來發起致命一擊。
那么問題來了,假設鳴人的查克拉能量為 M,他影分身的個數最多為 N,那么制造影分身時有多少種不同的分配方法?
注意:
影分身可以分配0點能量。
分配方案不考慮順序,例如:M=7,N=3,那么 (2,2,3) 和 (2,3,2) 被視為同一種方案。
輸入格式
第一行是測試數據的數目 t。
以下每行均包含二個整數 M 和 N,以空格分開。
輸出格式
對輸入的每組數據 M 和 N,用一行輸出分配的方法數。
數據范圍
0≤t≤20,
1≤M,N≤10
輸入樣例:
1
7 3
輸出樣例:
8
代碼如下:
#include <iostream> using namespace std; int cnt,n,m; const int N = 1010; int dp[N][N];int main() {cin>>cnt;while(cnt--){cin>>n>>m;for (int i = 0;i<=n;i++) dp[i][1] = 1;for (int i = 0;i<=m;i++) dp[0][i] = 1;for (int i = 1;i<=n;i++)for (int j = 1;j<=m;j++){if (i < j) dp[i][j] = dp[i][i];else if (i >= j) dp[i][j] = dp[i][j-1]+dp[i-j][j];}cout<<dp[n][m]<<endl;}return 0; }總結
以上是生活随笔為你收集整理的m个苹果放入n个盘子问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Pad Air 2 平板部分参
- 下一篇: 我国大推力液氧煤油火箭发动机试车首次实现