我觉得自己的思路没问题。。 最开始也是想的DP,后面想想枚举碗的个数再用组合数更容易,而且不可能有重复,但是也只过了40? 看到别的帖子有人发了个代码,他没说自己A了没,但是明显是错的,他在算组合数的时候用了除法,然后还取模。。  上面是我的代码,下面是那个人的代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;

int mod = 10000;
int C[55][55];
void init()
{
    memset(C,0,sizeof(C));
    C[0][0]=1;
    for(int i=1; i<=51; i++)
    {
        C[i][0]=C[i][i]=1;
        for(int j=1; j<i; j++)
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    }
}

int main()
{
    int n,m,k;
    init();
    while(scanf("%d %d %d",&m,&n,&k)!=EOF)
    {
        int ans=0,ans1=0;
        for(int i=1; i<k; i++) ///鱼丸所用碗数量
        {
            for(int j=1; j+i<=k; j++) ///牛丸所用碗数量
            {
                if(i>m || j>n)
                    continue;
                ans = ans + C[m-1][i-1] * C[n-1][j-1] %mod;
                ans %= mod;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


#include<bits/stdc++.h>
#include<unordered_set>
using namespace std;
int m, n, k;
int mod = 10000;
int main()
{
    cin >> m >> n >> k;
    if (k == 1)
    {
        cout << 0 << endl;
        return 0;
    }
    int m1 = min(m, k - 1);
    int n1 = min(n, k - 1);
    vector<int> num_m(m1+1);
    num_m[1] = 1;
    for (int i = 2; i <= m1; ++i)
    {
        num_m[i] = num_m[i - 1] * (m + 1 - i) / (i - 1);
        num_m[i] %= mod;
    }
    vector<int> num_n(n1 + 1);
    num_n[1] = 1;
    for (int i = 2; i <= n1; ++i)
    {
        num_n[i] = num_n[i - 1] * (n + 1 - i) / (i - 1);
        num_n[i] %= mod;
    }
    int res = 0;
    for (int i = 1; i <=m1; i++)
    {
        int right = min(k - i, n1);
        for (int j = right; j >= 1; j--)
        {
            res += num_m[i] * num_n[j];
            res %= mod;
        }
    }
    cout << res << endl;
    return 0;
}