UVa 10910 - Marks Distribution

传送门

UVa 10910 - Marks Distribution

题意

有n门科目,总分sum,最低分k,求有多少种情况。

思路

$dp(i, j) += dp(i - 1, k)$

$dp(i, j)$表示前i个课程总分为j的情况有多少

还是记忆化搜索用得顺手╰( ̄▽ ̄)╭

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 70;
 
LL dp[80][80];
int rem, n, sum, least;
 
LL DFS(int n, int curSum, int res)
{
    if (sum - res < least)
        return 0;
    if (n == 1)
        return 1;
    LL &cur = dp[n][curSum];
    if (cur != -1)
        return cur;
    cur = 0;
    for (int i = least; i <= least + rem; i++)
        if (curSum >= i)
            cur += DFS(n - 1, curSum - i, res + i);
    return cur;
}
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int i, j, T;
    scanf("%d", &T);
    while (T--)
    {
        memset(dp, -1, sizeof dp);
        scanf("%d%d%d", &n, , &least);
        rem = sum - n * least;
        printf("%lld\n", DFS(n, sum, 0));
    }
    return 0;
}

Powered by Jekyll and Theme by solid