洛谷P1020


title: "dfs+完全背包+数学"
author: Sun-Wind
date: February 4,2022

又是一道做的很麻的题,准确来说感觉这不是一道很好的dfs题,没有体现dfs的一些特点
反而感觉是在考察dp,刚开始也是按照我的思路交了3次都没过
原本以为所选的数应该都是由上一次的最大值推出来的,后面看了第一个样例才知道贪心贪错了
但其实这道题真想卡你的话,题解区的很多人都是会被卡掉的,我觉得这题直接改成完全背包算了

#include <iostream>
#include <utility>
using namespace std;
typedef long long ll;
#define fi(i, a, b) for (int i = a; i <= b; ++i)
#define fr(i, a, b) for (int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int, int>;
//#define DEBUG
int res[20];
int temp[20];
int n, m;
int maxn;
int dp[10000];
int mapp[10000];
int mx;
int dpp(int x){
    fi(i,1,temp[x]*n) dp[i] = 0x3f3f3f3f;
    fi(i,1,x){
        fi(j,temp[i],temp[x]*n){
            dp[j] = min(dp[j],dp[j-temp[i]] + 1);
        }
    }
    fi(i,1,temp[x]*n) if(dp[i] > n) return i - 1;
    return temp[x] * n;
}
void dfs(int x,int mx)
{
    if(x == m + 1) {
        if(mx > maxn) {
            maxn = mx;
            fi(i,1,n) res[i] = temp[i];
        }
        return;
    }
    fi(i,temp[x-1]+1,mx+1){
        temp[x] = i;
        mx = dpp(x);
        // cout << p << endl;
        dfs(x+1,mx);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    dfs(1,0);
    cout << res[1];
    fi(i, 2, m)
    {
        cout << " " << res[i];
    }
    cout << endl;
    // fi(i, 0, 7) cout << mapp[i] << " ";
    // cout << endl;
    // fi(i, 0, 9) cout << dp[i] << " ";
    // cout << endl;
    cout << "MAX=" << maxn << endl;
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    return 0;
}
上一篇:直接插入排序


下一篇:内部类(类里再定义类)--day12---未完