UVA 10910 Marks Distribution(组合数学 或 递推)
生活随笔
收集整理的這篇文章主要介紹了
UVA 10910 Marks Distribution(组合数学 或 递推)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:一個(gè)人N門課程的總成績(jī)?yōu)門,每門課程的最低成績(jī)?yōu)镻,求一共有多少種可能的分配方法。
題解:可以先求出超出的部分 T = T - n*p;剩余的相當(dāng)于n個(gè)里面每個(gè)科目放0,1分等。
這題我只懂了遞推,不懂組合數(shù)學(xué),看來太弱了
dp[i][j] = dp[i-1][0] + dp[i-1][1] +......+d[[i-1][j];表示前i個(gè)盒子放j個(gè)球的方法
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; LL dp[80][80]; int main(){int t,n,T,p;cin >> t;while(t--){cin >> n >> T >> p;T = T - n * p;memset(dp,0,sizeof(dp));for(int i = 0;i <= n;i++)dp[i][0] = 1;for(int i = 1;i <= n;i++){for(int j = 1;j <= T;j++){for(int k = 0;k <= j;k++){dp[i][j] += dp[i-1][k];}}}cout << dp[n][T] << endl;} }
組合數(shù)學(xué)
把T分分成T份放入到n個(gè)科目中,相當(dāng)于把T個(gè)球放到n個(gè)盤子中,用多少種方法?(求大神解釋|隔板法俺不懂啊)
#include <cstdio> typedef long long LL;LL C(LL n, LL k) {if(n - k < k) k = n - k;LL ans = 1;for(int i = 1; i <= k; i++)ans = ans * (n - i + 1) / i;return ans; }int main() {int cas;LL n, t, p;scanf("%d", &cas);while(cas--) {scanf("%lld%lld%lld", &n, &t, &p);t = t - n * p;LL ans = C(n + t - 1, n - 1);printf("%lld\n", ans);}return 0; }
隔板法:
總結(jié)
以上是生活随笔為你收集整理的UVA 10910 Marks Distribution(组合数学 或 递推)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手哥架构宝典系列:支付系统2.0架构演进
- 下一篇: 阿里修冶:微服务拆分之道