分支限界法--期限作業

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int n, parent[6] = {-1};
//int p[6] = {0,6,3,4,8,5}, t[6] = {0,2,1,2,1,1}, d[6] = {0,3,1,4,2,4};
int p[5] = {0,5,10,6,3}, t[5] = {0,1,2,1,1}, d[5] = {0,1,3,2,1};


int cmp(pair<int,int>a, pair<int,int>b) {
    return a.first < b.first;
}

//判斷是否爲解節點
bool judge(int value) {
    vector<int> v;
    int index = 1;
    pair<int,int> pa[1005];
    while (parent[value] != -1) { // 尋找節點
        v.push_back(value);
        pa[index] = make_pair(d[value], t[value]);
        value = parent[value];
        index++;
    }
    sort(pa+1, pa+index, cmp);
    int deadLine = 0;
    for (int j = 1; j < index; ++j) {
        deadLine += pa[j].second;
        if(deadLine > pa[j].first) {
            return false;
        }
    }
    return true;
}

//獲取C
int getC(int value) {
    vector<int> v;
    int add = 0, sum = 0;
    while (parent[value] != -1) { // 尋找節點
        add += p[value];
        v.push_back(value);
        value = parent[value];
    }
    for (int i = 1; i <= value; ++i) {
        sum += p[i];
    }
    return sum - add;
}

//獲取U
int getU(int value) {
    vector<int> v;
    int add = 0, sum = 0;
    while (parent[value] != -1) { // 尋找節點
        add += p[value];
        v.push_back(value);
        value = parent[value];
    }
    for (int i = 1; i <= n; ++i) {
        sum += p[i];
    }
    return sum - add;
}

void lc() {
    int e = 0, U = 10001, ans = 0;
    parent[e] = -1;
    priority_queue<int> q;
    for (int j = 1; j <= n; ++j) {
        for (int i = e + 1; i <= n; ++i) { // 當前節點的兒子節點
            if(getC(i) < U) {
                q.push(i);
                parent[i] = e;
                if(judge(i) && getU(i) < U) {
                    U = getU(i);
                    ans = i;
                }
            }
        }
        e = ans;
        if(!judge(ans + 1) || getC(ans + 1) >= U) { // output
            cout << "min is " << U;
            break;
        }
    }
}

int main() {
    cin >> n;
    lc();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章