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 ;
}