题目描述
用分支限界法解决问题,带时限的排序问题可描述为:设有n个进程和一台处理机,每个进程所需的处理时间、要求的时限和收益可用三元组(pi, di, ti),0<=i<n表示,其中,进程i的所需时间为ti,如果进程i能够在时限di内完成,将可收益pi,求使得总收益最大的进程子集J。
输入
第一行输入n(0<n<15)的值;第二行输入pi;第三行输入di;第四行输入ti (i=0,…,n-1且进程已经按时限非减次序排列)。
输出
xi(用固定长度n-元组xi表示,xi=0或1,i=0,…,n-1),每个xi后带有一个空格。
样例输入
4
5 3 6 10
1 1 2 3
1 1 1 2
样例输出
0 0 1 1
下面的代码该怎么改
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 15;
int p[N],d[N],t[N];
int n;
int U=0;
int ans[N];
struct Node {
int time; // 当前时间
int zy;
int current;
int c;//已损失的进程价值
int u;// 已损失的进程价值 +后面全部进程价值之和
struct Node *parent;
};
void print_ans(Node *x){
if(x->current>=0)print_ans(x->parent);
cout<<x->zy<<" ";
}
bool feassible(Node *x){
// cout<<"time="<<x->time<<" di="<<d[x->current]<<endl;
// cout<<"c="<<x->c<<" U="<<U<<endl;
if(x->time>d[x->current]||x->c>=U){
return false;
}
if(x->u<U){
U=x->u;
}
return true;
}
void fifobb(Node* tt){
queue <struct Node *> lst;
Node *E =tt;
int m=-1;
m++;
while(m<=n-1){
// cout<<m<<" ";
for(int i=0;i<2;i++){
Node *x = new Node;
x->zy=(i==0);
x->parent=E;
x->current=m;
if(x->zy==0){//不要
x->time=E->time;
x->c=E->c+p[m];
x->u=E->u;
}else{//要
x->time=E->time+t[m];
x->c=E->c;
x->u=E->u-p[m];
}
if(feassible(x)){
if(m==n-1){
print_ans(x);
}
lst.push(x);
}
}
E=lst.front();
lst.pop();
m=m+1;
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> p[i];
U+=p[i];
}
for (int i = 0; i < n; ++i) {
cin >> d[i];
}
for (int i = 0; i < n; ++i) {
cin >> t[i];
}
Node *t = new Node;
t->c=0;
t->time=0;
t->zy=-1;
t->parent=NULL;
t->current=-1;
t->u=U;
fifobb(t);
return 0;
}