n皇后问题
回溯——子集树解决办法
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int *x;
int n;
int num = 0;
bool constraint(int k){
for(int i = 1;i < k;i++){
if((x[i] == x[k]) || ( abs(x[i] - x[k]) == abs(k - i)))
return false;
}
return true;
}
void output(){
cout<<endl;
cout<<"具体放置位置:"<<endl;
for(int i = 1;i <= n;i ++){
cout<<"第"<<i<<"行放在第"<<x[i]<<"列上"<<endl;
}
}
void swap(int *a,int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void backtrack(int k){
if(k > n){
num ++;
output();
}
else{
for(int i = 1;i <= n;i ++){
x[k] = i;
if(constraint(k))
backtrack(k + 1);
}
}
}
int main(){
cout<<"请输入皇后个数:";
cin>>n;
x = new int[n + 1];
backtrack(1);
cout<<"解法种数:"<<num<<endl;
delete[] x;
return 0;
}
回溯——排列树解决办法
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int *x;
int n;
int num = 0;
bool constraint(int k){
for(int i = 1;i < k;i++){
if((x[i] == x[k]) || ( abs(x[i] - x[k]) == abs(k - i)))
return false;
}
return true;
}
void output(){
cout<<endl;
cout<<"具体放置位置:"<<endl;
for(int i = 1;i <= n;i ++){
cout<<"第"<<i<<"行放在第"<<x[i]<<"列上"<<endl;
}
}
void swap(int *a,int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void backtrack(int k){
if(k > n){
num ++;
output();
}
else{
for(int i = k;i <= n;i ++){
swap(&x[i],&x[k]);
if(constraint(k))
backtrack(k + 1);
swap(&x[i],&x[k]);
}
}
}
int main(){
cout<<"请输入皇后个数:";
cin>>n;
x = new int[n + 1];
for(int i = 1;i <= n;i++){
x[i] = i;
}
backtrack(1);
cout<<"解法种数:"<<num<<endl;
delete[] x;
return 0;
}
0-1背包问题
回溯——子集树解决办法
#include<iostream>
using namespace std;
int maxValue = 0;
int bagSize;
int n;
int *w,*v;
int *nowIn;
int *bestSolution;
void output(){
int sum = 0;
int weight = 0;
for(int i = 1;i <= n;i++){
if(nowIn[i] == 1){
sum += v[i];
weight += w[i];
}
}
if(sum > maxValue && weight <= bagSize){
maxValue = sum;
for(int i = 1;i <= n;i++){
bestSolution[i] = nowIn[i];
}
}
}
void backtrack(int k) {
int size = 0;
if(k > n){
output();
}
else{
for(int i = 1;i >= 0;i --){
nowIn[k] = i;
if(nowIn[k] == 0)
backtrack(k + 1);
else{
for(int j = 1;j <= n;j++){
if(nowIn[j] == 1){
size += w[j];
}
}
if(size <= bagSize){
size = 0;
backtrack(k + 1);
}
}
}
}
}
int main(){
cout<<"请输入背包的空间:";
cin>>bagSize;
cout<<"请输入共有多少个物品:";
cin>>n;
w = new int[n + 1];
v = new int[n + 1];
nowIn = new int[n + 1];
bestSolution = new int[n + 1];
cout<<"请输入各个物品的重量"<<endl;
for(int i = 1;i <= n;i++) {
cout<<"第"<<i<<"个物品的重量:";
cin>>w[i];
}
for(int i = 1;i <= n;i++){
cout<<"第"<<i<<"个物品价值:";
cin>>v[i];
}
for(int i = 1;i <= n;i++){
nowIn[i] = 0;
}
backtrack(1);
cout<<"选中第" ;
for(int i = 1;i <= n;i++){
if(i != n && bestSolution[i] == 1)
cout<<i<<",";
else if(i == n && bestSolution[i] == 1)
cout<<i;
}
cout<<"个物品 ";
cout<<"maxValue:"<<maxValue<<endl;
return 0;
}