每個桶的容量為a1,a2,a3......am
設dp[i][j]為僅使用第1,2,3...i個桶,放入j個球共有多少種放置方法。
設t=min,表示第i個桶裡面最多可以放入t個球。
當第i個桶放入0,1,2....t個球時,共有dp[i-1][j],dp[i-1][j-1]....dp[i-1][j-t]種放法。
得到dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+....+dp[i-1][j-t]
運用這種思想寫出來的**複雜度為o(n*(a1+a2+...+am))
我們可以發現
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+....+dp[i-1][j-t]
dp[i][j-1]=dp[i-1][j-1]+dp[i-1][j-2]+....+dp[i-1][j-t]+dp[i-1][j-t-1]
所以dp[i][j]=dp[i][j-1]-dp[i-1][j-t-1]+dp[i-1][j];
樣例:3個球,3個桶,容量分別為,共有多少取法。
答案6(0+0+3,0+1+2,0+2+1,1+1+1,1+2+0,1+0+2)
#include #include using namespace std;
int main()
; //第i個桶容量a[i],桶0不存在
int dp[4][4];
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if(i==0)
int t=j
每天一道演算法題 n個球中取出m個球不同思路分析
在開始演算法分析之前,這裡需要引入數學中組合 排列的概念,先基本介紹一下組合 排列 定義 從n個不同的元素中任取m個 m n 元素,按照一定的順序排成一列,叫做從n個不同的元素中取出m個元素的排列 使用排列的三個條件 1 n個不同元素 2 任取m個 3 講究順序排列數計算公式 a n,m 這裡稍微說...
m個蘋果放入n個盤子問題,n個盤子不同的問題
網上已經有許多關於,m個蘋果放入n個盤子的問題 盤子相同 但是沒有具體關於n個盤子不同的問題,在這裡根據前面的n個盤子相同的基礎上,進行分析得出相應的遞推公式。針對前一問題這裡不再詳細介紹,具體的網頁鏈結為 問題描述 問題描述 把m個同樣的蘋果放在n個不同的盤子裡,允許有的盤子空著不放,問有多少種不...
M個蘋果放到N個相同盤子和N個不同盤子的解法
題目很簡單 就是把m個蘋果放到n個盤子中,盤子可以為空,問你有多少種放法。首先應該明白,盤子相同時三個盤子放1 1 5 和 5 1 1 是相同的,盤子不一樣時是不同的放法。1 放入相同盤子 蘋果為m,盤子為n 放蘋果時分為兩種可能 一種是蘋果數大於等於盤子數,第二種是蘋果數小於盤子數。f m,n 是...