51nod1489回溯构造

来源:互联网 发布:js copy对象 编辑:程序博客网 时间:2024/06/04 14:59
#include<iostream>using namespace std;const int INF = 0x3f3f3f3f;int n, a, b;int turn(int D[15],int x){    if (D[x] >= 0)        return (D[x] / b) + 1;    else        return 0;}int tans = INF;void fun(int DD[15],int id,int c){    if (id == n - 1)    {        tans = (tans < c) ? tans : c;    }    else    {        int x = DD[id];        if (x < 0)            fun(DD, id + 1, c);        else        {            int cnta = 0, cntb = (DD[id] / b) + 1;            while (cntb>=0)            {                int DDx[15];                for (int i = 0; i < n; i++)                {                    DDx[i] = DD[i];                }                DDx[id] -= (cnta*a + cntb*b);                DDx[id + 1] -= (cntb*a + cnta*b);                DDx[id + 2] -= (cntb*b);                fun(DDx, id + 1, c + cnta + cntb);                cntb--;                int t = DD[id] - cntb*b;                cnta = 1 + (t / a);            }        }    }}int main(){    cin >> n >> a >> b;    int D[15];    for (int i = 0; i < n; i++)    {        cin >> D[i];    }    int cnt1 = turn(D,0);    D[0] -= cnt1*b;    D[1] -= cnt1*a;    D[2] -= cnt1*b;    int cntn = turn(D,n - 1);    D[n - 1] -= cntn*b;    D[n - 2] -= cntn*a;    D[n - 3] -= cntn*b;    int ans = 0;    ans += cnt1+cntn;    fun(D, 1, 0);    ans += tans;    cout << ans << endl;    return 0;}

//注意hp为0的时候还不算死亡

0 0