#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//做蛋糕
#define pai 3
int V=0,Q=0;
int mins=99999;
int h[], r[],v[],s[];
void cake(int t) {
int n, m;
int i;
r[0] = m + 1;
h[1] = n;
if (t = m){
if (V != n * pai)
return;
Q += pai * pow(r[1], 2);
if (Q < mins)
mins = Q;
return;
}else {
if (V > n* pai)
return;
if (pow(r[t], 2) > n)
return;
if (Q > mins)
return;
for (int i = r[t - 1] - 1; i > 0; i--) {
r[t] = i;
h[t] = 1;
v[t] = pai * pow(r[t], 2) * h[t];
V += v[t];
s[t] = 2 * pai * r[t] * h[t];
Q += s[t];
cake(t + 1);
}
}
}
//8 最大装载问题:分支限界法
void enqueue(int x) {
}
void dequeue(int x) {
}
bool isempty() {
}
int maxloading(int w[], int n, int c) {
enqueue(-1);
int i = 1;
int ew = 0, r = 0, bestw = 0;
for (int i = 2; i <= n; i++) {
r += w[i];
}
while (true) {
int wt = ew + w[i];
if (wt < c) {
if (wt > bestw)
bestw = wt;
if (i < n)
enqueue(wt);
}
if (ew + r > bestw&& i < n) {
enqueue(ew);
}
dequeue(ew);
if (ew == -1) {
if (isempty())
return bestw;
enqueue(-1);
dequeue(ew);
i++;
r -= w[i];
}
}
}
//01背包问题
typedef struct bnode {
struct bnode *parent;
int lchild;
}bnode;
typedef struct heapnode {
int b;
int ew;
int ep;
int level;
bnode* p;
bnode* E;
};
#define n 5
int ew = 0,bestw=0;
int ep, bestp;
int w[n];
int p[n];
int nowv;
int c, p;
void queue(int b,int ew,int ep,bool ch,int level) {//依次是上界、当前重量、当前价值,左右子树(1左 0右)、层数
bnode* bb = (bnode*)malloc(sizeof(bnode));
heapnode* N;
bb->parent = N->E;
bb->lchild = ch;
N->b = b;
N->ep = ep;
N->ew = ew;
N->level = level;
N->p = bb;
}
heapsort deletemax(heapsort h) {
}
struct heapsort {
struct heapsort deletemax(heapsort);
};
void bag() {//LCBB:优先队列
int i, j, k;
int b = bound(ew);
while (ew) {
if (ew + w[i] <= nowv) {
if (ep + p[i] >= bestp) {
bestp = ep + p[i];
}
queue(b,ew,ep,1,i+1);
}
if (b > ep + p[i])
queue(b,ew,ep,0,i+1);
heapsort N;
N.deletemax(N);
}
}
typedef struct Queue {
};
void initqueue(Queue Q) {
}
void enqueue(int x) {
}
void dequeue(int x) {
}
int baglifobb() {//LIFOBB
Queue Q;
initqueue(Q);
enqueue(-1);
int i = 1;
int ew = 0, ep = 0, bestw = 0, bestp = 0,r=0;
while (true) {
if (ew + w[i] <= c) {
if (ep + p[i] >= bestp)
bestp = ep + p[i];
enqueue(ew + w[i]);
}
int b = bound(ew);
if (b >= bestp)
enqueue(ew);
dequeue(ew);
if (ew == -1) {
if (isempty()) {
return bestw;
}
enqueue(-1);
dequeue(ew);
i++;
}
}
}
int bound(int i) {
int cleft = c - ew;
int b = ep;
//物品已经默认单位价值递减排序,则在不超重的情况下,递减填装物品
while (i <= n && w[i] <= cleft) {
cleft -= w[i];
b += p[i];
i++;
}
if (i <= n) {//最后一个物品无法完整装入时候
b += p[i] / w[i] * cleft;//单位价值*剩余容量
return b;
}
}
【复习】分支限界法
最新推荐文章于 2023-12-12 15:44:22 发布