Vijos P1159 - 岳麓山上打水

传送门

Vijos P1159 - 岳麓山上打水

思路

了解了一下迭代加深搜索(DFSID),就是枚举下限的DFS。

枚举种类,然后依次判断。

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int VMAXN = 2e4 + 10;
const int TMAXN = 100 + 10;
const int INF = 0x3f3f3f3f;
 
int num[TMAXN], dp[VMAXN], k, n, m;
int ans[TMAXN];
 
bool Check(int sum)
{
    int &cur = dp[sum];
    if (cur != -1)
        return cur;
    if (sum == 0)
        return cur = 1;
    for (int i = 0; i < k; i++)
        if (sum >= ans[i] && Check(sum - ans[i]))
            return cur = 1;
    return cur = 0;
}
 
void DFSID(int cur, int dep)
{
    if (dep == k)
    {
        memset(dp, -1, sizeof dp);
        if (Check(n))
        {
            printf("%d", k);
            for (int i = 0; i < dep; i++)
                printf(" %d", ans[i]);
            puts("");
            exit(0);
        }
        return;
    }
    if (cur >= m)
        return;
    ans[dep] = num[cur];
    DFSID(cur + 1, dep + 1);
    DFSID(cur + 1, dep);
}
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int i, j;
    scanf("%d%d", &n, &m);
    for (i = 0; i < m; i++)
        scanf("%d", #[i]);
    sort(num, num + m);
    for (k = 1; k <= m; k++)
        DFSID(0, 0);
    return 0;
}

Powered by Jekyll and Theme by solid