1. 程式人生 > >(經典)POJ-3046 多重集組合數

(經典)POJ-3046 多重集組合數

題目大意:螞蟻牙黑,螞蟻牙紅:有A只螞蟻,來自T個家族,分別記為ant[i]個。同一個家族的螞蟻長得一樣,但是不同家族的螞蟻牙齒顏色不同。任取n只螞蟻(S <= n <= B),求能組成幾種集合?

分析:

多重集組合數也是由多重揹包問題拓展出來的一類經典問題。這裡仍然給大家講2種方法:

①樸素方法:

狀態:dp[i][j]:前i種中選j個可以組成的種數

決策:i種選k個,k<=ant[i] && j-k>=0

轉移:dp[i][j]=Σdp[i-1][j-k]

複雜度為O(B*Σant[i])即O(B*A)也即O(A^2),雖說這題A最大可到1e5,但是實際資料水,能過

②優化遞推式

狀態:dp[i][j]:前i種中選j個可以組成的種數

決策:i種不選或者至少選一個

轉移:

1.若不選,顯然為dp[i-1][j]

2.若至少選一種,那麼為dp[i][j-1]-dp[i-1][j-ant[i]-1]

我們這樣來理解,dp[i][j-1] 理解為已經選了第i種一個,至於還選不選這裡我們不管它,所以它可以用來代表至少選一個

但是dp[i][j-1]還有一層含義便是前i種中選j-1個可以組成的種數,所以它包含了選ant[i]個第i種,即dp[i-1][j-ant[i]-1],但

dp[i][j] 最多選ant[i]個第i種,所以最後要減去這一種。

所以 dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-ant[i]-1]

複雜度為O(T*B)

僅附上優化過的程式碼:

#include<iostream>
using namespace std;
#define MOD 1000000
int T, A, S, B;
int ant[1005];
int dp[2][100000];
int ans;
int main()
{
	scanf("%d%d%d%d", &T, &A, &S, &B);
	for (int i = 1; i <= A; i++)
	{
		int aa;
		scanf("%d", &aa);
		ant[aa]++;
	}
	dp[0][0] = dp[1][0] = 1;
	for (int i = 1; i <= T; i++)
		for (int j = 1; j <= B; j++)
			if (j - ant[i] - 1 >= 0) dp[i % 2][j] = (dp[(i - 1) % 2][j] + dp[i % 2][j - 1] - dp[(i - 1) % 2][j - ant[i] - 1] + MOD) % MOD;      //在取模時若出現了減法運算則需要先+Mod再對Mod取模,防止出現負數(如5%4-3%4為負數)
			else dp[i % 2][j] = (dp[(i - 1) % 2][j] + dp[i % 2][j - 1]) % MOD;
	for (int i = S; i <= B; i++)
		ans = (ans + dp[T % 2][i]) % MOD;
	printf("%d\n", ans);
	return 0;
}

相關推薦

經典POJ-3046 多重合數

題目大意:螞蟻牙黑,螞蟻牙紅:有A只螞蟻,來自T個家族,分別記為ant[i]個。同一個家族的螞蟻長得一樣,但是不同家族的螞蟻牙齒顏色不同。任取n只螞蟻(S <= n <= B),求能組成幾

poj 3046 多重合數【水一下】

題目大意:有t個螞蟻種群,共a只螞蟻,從這些種群中挑出n只螞蟻,方法共有x[n]種,計算x[s]+x[s+1]+…+x[b]。 這是一道多重集組合數題目。用dp[i][j]表示前i中種群中挑出j只螞蟻的方案數。依據《挑戰程式競賽(第二版)》 P68-P69公式

POJ 3046 Ant Counting多重合數

Description Bessie was poking around the ant hill one day watching the ants march to and fro while gathering food. She realized that ma

POJ 3046 Ant Counting(dp—多重合數問題)

 Ant Counting Time Limit:1000MS Memory Limit:65536K Total Submissions:3753 Accepted:1475

POJ 3046 Ant Counting——多重合數

定義dp【i】【j】為從前i種物品中選j個物品對應的方案總數 狀態轉移方程為:dp【i】【j】 = ∑dp【i-1】【j-k】(k的範圍是【0,min(j,cnt【i】)】) 優化的話只要寫出dp【i】【j】和dp【i】【j-1】對應的求和展開式就能找到兩者之間的關係,從而

Ant Counting多重合數

原體連結 Language: Ant Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4895 Accepted: 1866 Descriptio

不易POJ-1742 多重部分和,多重揹包可行性

題目大意:傳說中的男人八題,是男人就A這八題。有n種面額的硬幣,面額個數分別為A_i、C_i,求最多能搭配出幾種不超過m(1-m)的金額? 分析: ①首先來看看樸素的方法: bool dp[i]

多重合數

/* 有n種物品,第i種物品有ai個,不同類的物品可以互相區分但相同種類的無法區分,從這些物品中取出m個話,有多少種取法?,求取出方案模 M 的餘數。 1<=n<=1000 1<=m<=1000 1<=ai<=1000 1<=M&l

劃分數、多重合數練習總結

劃分數練習總結 劃分數描述的就是有N種相同的東西,將他們劃分成M組,求有多少種不同的劃分(1,2,5 和 1,5,2 是一樣的),先來一段書上的話 其中那個錯誤推導看得懂是啥子意思,但是後面那個正確推導 : dp[i][j] = dp[i-1

多重合數-DP

題目: 有n種物品, 第i種物品有a個. 不同種類的物品可以互相區分, 但相同種類的無法區分. 從這些物品中取出m個, 有多少種取法? 求出數模M的餘數. 例如: 有n=3種物品, 每種a={1,2,3}個, 取出m=3個, 取法result=6(0+0+3, 0+

poj 1182 食物鏈經典!種類並查

連結: 原題: Description 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。  現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。  有人用兩種說法對這N個動物所構

POJ 1182 食物鏈 經典帶權並查

第三次複習了,最經典的並查集 題意:動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。 有人用兩種說法對這N個動物

POJ3728The merchant (倍增)LCADP經典||並查壓縮路徑?

城市 contain 分析 之間 pat rst .com span 題解 There are N cities in a country, and there is one and only one simple path between each pair of c

Poj - 3254 Corn Fields 【狀壓DP】經典

初始化 include str 結果 沖突 += poj ota scanf 題目鏈接:https://vjudge.net/contest/224636#problem/G 轉載於:https://blog.csdn.net/harrypoirot/article/det

Poj 3667(線段樹,查詢連續區間,區間合併)經典

problem The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shore

CO-PRIME初探 莫比烏斯NYOJ1066經典gcda,b=1

put size 兩個 test hat ott == clas otto CO-PRIME 時間限制:1000 ms | 內存限制:65535 KB 難度:3 描寫敘述 This problem is so easy! Can you solve it

api-gateway實踐4網關服務成驗證

pig server 服務集 blank 網關 ces ron ken localhost 原始服務地址: http://10.110.17.20:7070/spring-oauth-server/m/user_info?access_token=8d671613-da31

mysql進階MHA高可用

mysql mha簡介: 1、MHA目前在MySQL高可用方面是一個相對成熟的解決方案,是MySQL高可用環境下故障切換和主從提升的高可用軟件 2、MHA能在短時間內完成故障切換,並且在最大程度上保證數據的一致性,以達到真正意義上的高可用 3、MHA基於mysql協議,通過mysql主從或主主進行復制 4、

vue移動音樂app開發學習:輪播圖件的開發

hub out webapp width eth reat slot utc -1 本系列文章是為了記錄學習中的知識點,便於後期自己觀看。如果有需要的同學請登錄慕課網,找到Vue 2.0 高級實戰-開發移動端音樂WebApp進行觀看,傳送門。 完成後的頁面狀態以及項目結構如