購票問題
題目大意:一張票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名軍官來自不同的部隊並且軍銜各不相同。令他惱火的是,無論怎麼絞盡腦汁也排不成。後來,他去求教瑞士著名的大數學家...