1190 生日蛋糕 NI

dfs+剪枝

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <algorithm>
int N, M, S;
//const int MAXN = , MAXM = 0;
//typedef long long ll;
using namespace std;
int miarr[25];
void dfs(int leftv, int m, int cost, int prer, int preh) {
    if (cost >= S) return;
    if (m == 0) {
        if (leftv) return;
        cost += prer * prer;
        S = min(S, cost);
        return;
    }
    
    for (int h = m; h < preh; h++) {
        for (int r = m; r < prer; r++) {
            int v = leftv - r * r * h;
            int dwon = prer * prer - r * r;
            int side = 2 * r * h;
            int mx = (h - 1) * (r - 1) * (r - 1) * m;
            if (v < 0) break;
            if (mx < v) continue;//用不完
            if (v < miarr[m - 1]) break; //不够用
            int nc = cost + side;
            if (m != M) nc += dwon;
            dfs(v, m - 1, nc, r, h);
        }
    }
}
int main() {
    cin >> N >> M;
    S = 2000000000;
    for (int i = 1; i < 22; i++) miarr[i] = i * i + miarr[i - 1];
    dfs(N, M, 0, 100, 10000);
    if (S == 000000000) S = 0;
    cout << S << endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原创 先看个小题热热身。 整数分解 整数分解为若干项之和将一个正整数N分解成几个正整数相加,可以有多种分解方法,例...
    Cipolee阅读 978评论 0 2
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 2,236评论 0 3
  • 图上的DFS isVisited for(row){ for(column){ helper()}} 构建图 69...
    ziru_SUN阅读 814评论 0 0
  • dfsadmin主要操作命令 dfsadmin [GENERIC_OPTIONS] [-report] [-saf...
    itpark阅读 7,242评论 1 8
  • 二叉树基础知识:可查看http://www.cnblogs.com/polly333/p/4740355.html...
    雅芳阅读 409评论 0 0