给定N门课程总得分为T, 求在每门至少得P分情况下有多少种情况。
第一种解法:组合数学
#include <iostream>
using namespace std;
// ans = C(T - P * N + N - 1, N - 1);
int T, P, N;
long long ans;
void solve()
{
ans = 1;
long long n = T - P * N + N - 1, m = N - 1;
if(T - P * N < 0 ) {ans = 0; cout << ans << endl;}
else //C(n, m)
{
int x = 1;
if(n - m < m) m = n - m; //这里没有写,WA了好久
for(int i = n; i >= (n - m + 1); i--)
{
ans = ans * i;
ans /= x;
x++;
}
cout << ans << endl;
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> N >> T >> P;
solve();
}
return 0;
}
第二种解法:dp
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t, N, T, P;
int dp[100][100];
cin >> t;
while(t--)
{
cin >> N >> T >> P;
//dp[i][j] 表示 前i门课程总分为j的方法数
memset(dp, 0, sizeof dp);
for(int i = P; i <= T; i++) dp[1][i] = 1;
for(int i = 2; i <= N; i++ )
{
for(int j = P; j <= T; j++ )
{
for(int k = P; k <= T; k++ )
{
if(j - k >= P)
dp[i][j] += dp[i-1][j - k];
}
}
}
cout << dp[N][T] << endl;
}
return 0;
}