#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();
}
分支限界法--期限作業
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.