組合數學 購票問題

2022-05-03 16:39:11 字數 1952 閱讀 5003

購票問題

題目大意:一張票50元,有n個帶著50元的人和n個帶著100元的人,請問總共有多少種排隊方法使得不會出現購票找不回錢的尷尬局面?

輸入樣例:2

輸出樣例:2

這是一類非常有代表性的問題,下面將介紹該問題的5種解法

number 5:暴力列舉

很顯然,要使帶著100元的購票那麼就需要50的去找給他。

那麼可以抽象的看做當50元購票時50元的票數+1

而當100元購票時50元的票數-1

又因為100元的並不能找錢用,所以可以不做考慮……

那麼很容易可以看出我們在收取乙個人50元的時候50元的個數可以+1

所以定義乙個計數變數k

那麼我們可以決定此時是選擇50的人來買票或者是100的人來買票。

因為50找100,他們都有n個,則互相抵消。

最後可以直接看k是否==0

**如下:

#include#include#includeusing namespace std;

int n;

int k;

int ans;

void dfs(int tmp)

if(k)

k++;//在加乙個50的顯然不成問題

dfs(tmp+1);//搜尋

k--;

}int main()

}int main()

inline void write(int x)if(x<0)putchar('-'),x=-x;

int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;

for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;

}long long dp[100][100];

int a,b,n;

int main()

write(dp[n][n]-1);

}

number 1:卡特蘭數

答案數=c(2n,n)/(n+1)

答案數可以看做為總排列數-不符合要求數

而可以看出總排列數為2n裡面選n個,那麼就是c(2n,n)

可以抽象的看做當50元購票時50元的票數+1

而當100元購票時50元的票數-1

也就是50的個數要始終≥100的個數

不符合條件的就是在一段裡面有m+1個100元

有m個50元

那麼可以看做是從2n個裡面選擇n+1個

即c(2n,n+1)

c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)

**如下:

#includeusing namespace std;

int main()

組合數學問題

監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 6種狀態為 000 001 011 ...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...

組合數學 36軍官問題

據說普魯士的腓特列大帝曾組成一支儀仗隊,儀仗隊共有36名軍官,來自6支部隊,每支部隊中,上校 中校 少校 上尉 中尉 少尉各一名。他希望這36名軍官排成6 6的方陣,方陣的每一行,每一列的6名軍官來自不同的部隊並且軍銜各不相同。令他惱火的是,無論怎麼絞盡腦汁也排不成。後來,他去求教瑞士著名的大數學家...