1.n皇后
#include <iostream>
#include <cmath>
using namespace std;
int Place(int i,int k,int *x) { //i:列 k:第k个皇后 x:解向量
for(int j=0; j<k; j++) {
if(x[j]==i || abs(x[j]-i)==abs(j-k)) return 0;
}
return 1;
}
void NQueens(int k,int n,int *x) {
for(int i=0; i<n; i++) {
x[k]=i;
if(Place(i,k,x)) {
if(k==n-1) {
for(int j=0; j<n; j++) cout << x[j] << " ";
cout << endl;
} else {
NQueens(k+1,n,x);
}
}
}
}
int main() {
int n=8;
int *x = new int[n];
for(int i=0;i<n;i++) x[i]=-1;
NQueens(0,n,x);
return 0;
}
2. 装载问题
#include <iostream>
using namespace std;
int n; //集装箱数
int *x; //当前解
int *bestx; //当前第一艘船的最优解
int c1; //第一艘轮船的核定载重量
int c2; //第二艘轮船的核定载重量
int *w; //集装箱重量数组
int total; //所有集装箱重量之和
int cw; //当前第一艘船的载重量
int bestw; //当前第一艘船的最优载重量
int r; //剩余集装箱总重量
void Backtrack(int i) {
//搜索第i层结点
if(i>n) { //到达叶节点
if(cw>bestw) {
for(int j=1; j<=n; j++) bestx[j]=x[j];
bestw=cw;
}
return;
}
//搜索子树
r=r-w[i];
//搜索左子树
if(cw+w[i]<=c1) { //左子树可行解约束条件
x[i]=1;
cw=cw+w[i];
Backtrack(i+1);
cw=cw-w[i];//回溯
}
//搜索右子树
if(cw+r>bestw) { //右子树最优解约束条件
x[i]=0;
Backtrack(i+1);
}
r=r+w[i]; //回溯
}
void Show() {
if(total>c1+c2) {
cout << "装不下!";
return ;
} else {
Backtrack(1);
}
if(total-bestw>c2) {
cout << "装不下!";
return;
}
cout << "\n装载方案:\n";
cout << "装入c1:";
for(int i=1; i<=n; i++) {
if(bestx[i]) cout << w[i] << " ";
}
cout << endl;
cout << "装入c2:";
for(int i=1; i<=n; i++) {
if(!bestx[i]) cout << w[i] << " ";
}
}
void Init() {
cin >> c1 >> c2;
cin >> n;
x = new int[n+1];
bestx = new int[n+1];
w = new int[n+1];
for(int i=1; i<=n; i++) {
cin >> w[i];
total=total+w[i];
}
r=total;
}
int main() {
Init();
Show();
return 0;
}
测试案例 | ||
| ||
| ||
|