我用了dp,想着用一下组合数,但是#11WA了,求大佬指点
查看原帖
我用了dp,想着用一下组合数,但是#11WA了,求大佬指点
1587307
_Yamada_Ryo楼主2025/2/8 12:07
#include <stdio.h>
#include <string.h>
#define MAX_M 10010
#define int long long
int Cnk(int n, int k)
{
    int a = 1, b = 1;
    for (int i = n; i > n - k; i--)
    {
        a *= i;
    }
    for (int i = 1; i <= k; i++)
    {
        b *= i;
    }
    return a / b;
}
signed main()
{
    int n, m;
    int input[1001];
    int num[1001] = {0};
    int max = -1;
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &input[i]);
        num[input[i]]++;
        if (input[i] > max)
            max = input[i];
    }
    int dp[MAX_M] = {0};
    dp[0] = 1;
    for (int p = 1; p <= max; p++)
    {
        if (num[p] > 0)
        {
            int newdp[MAX_M] = {0};
            for (int j = 0; j <= m; j++)
            {
                if (dp[j] != 0)
                {
                    for (int k = 0; k <= num[p]; k++)
                    {
                        if (j + k * p <= m)
                        {
                            newdp[j + k * p] += dp[j] * Cnk(num[p], k);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            memcpy(dp, newdp, sizeof(dp));
        }
    }
    printf("%lld", dp[m]);
    return 0;
}

2025/2/8 12:07
加载中...