DFS 剪枝 N個蛋放入M個籃子並可以任意取

2022-03-20 12:12:16 字數 969 閱讀 6378

**筆試題:

有n個蛋和m個籃子,把蛋放到m個籃子裡,每個籃子都不能為空。另外,需要滿足:任意乙個小於n的正整數,都能由某幾個籃子內蛋的數量相加的和得到。寫出程式,使得輸入乙個(n,m),輸出所有可能的分配情況

#include "stdafx.h"

#include #include using namespace std;

#define max 1000

int ans[max];

int count = 0;

int cal = 0;

//如果前x的籃子已經放了y個雞蛋,則第x+1個籃子可以放1到y+1個雞蛋,(如果放y+2,則取不出y+1)

//第x+2個籃子可以放(y+y+1)+1=2y+2

//第x+3個籃子可以放(2y+2+y+1+y)+1=4y+4,這樣我們可以從0開始 ,依次開始遍歷所有存放情況

void dfs(int hasegg,int nextbasketindex,int totalegg,int totalbasket,int last)

printf("\n");

count++;

return ;

} if(nextbasketindex>=totalbasket||hasegg>=totalegg)

//剪枝1:如果後面的所有籃子都用最小數來填充 都比總數大

if(hasegg+last*(totalbasket-nextbasketindex)>totalegg)return;

//剪枝2:如果後面的所有籃子都用最大數來填充 還是不夠大

if((hasegg+1)*(pow(2,totalbasket-nextbasketindex)-1)+haseggreturn;

for(int i=last;i<=hasegg+1;i++)

}int solve(int egg,int basket)

void main()

m個蘋果放入n個盤子

放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 解題分析 設f m,n 為m個蘋果,n個盤子的放法數目,則先對n作討論,當n m 必定有n m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if n m ...

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.當盤...

m個蘋果放入n個盤子問題

這個問題,看似是乙個簡單的排列組合問題,但是加上不同的限制條件,會演變成不同的問題,感覺很奇妙,就總結一下列舉下來 問題一 問題描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 解題分析 設f m,n 為m個蘋果,n個盤子...