盒子與小球系列題解

2021-07-24 11:45:40 字數 1759 閱讀 5000

盒子與小球,noi**題庫的一系列題,可在noi題庫中提交。

盒子與小球二:n個有差別的盒子(1<=n<=20)。你有a個紅球和b個藍球。0 <= a <= 15, 0 <= b <= 15。球除了顏色沒有任何區別。你可以將球放進盒子。乙個盒子可以同時放進兩種球,也可以只放一種,也可以空著。球不必全部放入盒子中。程式設計計算有多少種放置球的方法。

我們可以設計乙個狀態,f[i][j][k]表示前i個盒子中放了a個紅球,b個藍球的方案數,那麼考慮轉移,對於當前這個盒子,我們可以放若干個紅球和若干個藍球,即f[i][j][k]=西格瑪(f[i-1][j-l][k-w]),其中l<=j,k<=w,這樣狀態量n^3,轉移n^2,總複雜度為n^5,可以過掉,不過我還看到有更好的方法,在提問裡。

#include#include#includeusing namespace std;

long long f[22][16][16],ans;

int n,a,b;

int main()

for (int j=0;j<=a;j++)

for (int k=0;k<=b;k++) ans+=f[n][j][k];

printf("%lld\n",ans);

return 0;

}

盒子與小球三:有n個相同的球,m個不同的盒子,每個盒子最多放k個球 ,請計算將這n個球全部放入盒子中的方案數模1000007後的結果 ,n<=5000,m<=5000。

我們可以設計狀態f[i][j]表示前i個盒子放j個求有多少種方法,那麼f[i][j]=西格瑪(f[i-1][j-l]),l的範圍是[0,k],狀態量是n^2,轉移是o(k),複雜度是o(n*m*k),tle,我們考慮優化轉移,我們發現其實l的範圍是固定的,類似於乙個滑動視窗,那麼我們可以維護乙個sum,sum=西格瑪(f[i-1][j-l]),在j增加後,我們令sum=sum-f[i-1][j-k]+f[i-1][j+1],這樣就做到了o(1)轉移,時間複雜度o(n*m)。

#include#include#includeusing namespace std;

#define maxn 5005

#define mod 1000007

int f[maxn][maxn];

int n,m,k,sum;

int main()

} printf("%d\n",f[m][n]);

return 0;

}

盒子與小球四:給定n個各不相同的小球,和m個不同的box,有多少種不同的放球方法,使得每個box裡的小球個數不小於k。n,m,k均小於15。

這道題的小球也不相同了,那麼我們考慮用隔板法,我們可以先預設小球是一樣的,爆搜出所有隔板的組合,當我們知道了每個盒子裝幾個小球後,我們有乙個公式:有n1個a1,n2個a2....ni個ai,不同的排列數為(n1+n2+..+ni)!/(n1!+n2!+....+ni!),這樣只要我們爆搜出所有的隔板組合,我們就能o(1)的知道這種組合的方案數,對於k=0的特殊情況,我們沒有了任何限制,那麼每個球都有m種選擇,那麼答案就是m^n。

#include#include#includeusing namespace std;

int n,r,k;

long long c[20],jj[20],ans;

void dfs(int last,int cnt)

{ if (cnt==r)

{ long long temp=1,res=n;

for (int i=1;i

盒子與小球之二

n個有差別的盒子 1 n 20 你有a個紅球和b個藍球。0 a 15,0 b 15。球除了顏色沒有任何區別。你可以將球放進盒子。乙個盒子可以同時放進兩種球,也可以只放一種,也可以空著。球不必全部放入盒子中。程式設計計算有多少種放置球的方法。就一行,n,a,b,用空格分開 就一行,輸出放置方案總數 2...

小球與盒子的問題

這類問題的基本模型是 你有 n 個小球,m 個盒子,現在想把這 n 個小球放進 m 個盒子中,問有多少種放的方法 但是只給出這樣的條件並不足夠,我們必須加上一些限制,否則結果是不確定的 一般加的有三個限制,即小球是否有區別 盒子是否有區別 允不允許有空盒子,也因此可以組合出八種不同的問題 接下來我們...

小球與盒子 的奇妙關係

小球盒子學得好,計數分數少不了。下面假設現在有 n 個球 m 個盒子。考慮乙個球有 m 種選擇方案,球之間的選擇互不影響,所以答案就是 m n 如果 n m 那麼顯然答案為 0 否則考慮第乙個球有 m 種放法,第二個有 m 1 種.所以答案就是 displaystyle prod i 如果 n,那麼...