📄 邮票问题(用递归回溯).txt
字号:
#include<cstdlib>
#include<iostream>
using namespace std;
const int N = 6; //一共有N个数
int W[100] = { 0,5,10,12,14,18,20}; //这N个数的权值
const int MAXNUM = 6; //最多允许的邮票数目
const int M = 30; //所求的和数
int X[MAXNUM+1]; //记录W的下标,解向量
bool checkX( int sum,int n)
{
int index = X[n];
if( sum + W[index] > M ) //如果比M要大则不不符合规则
return false;
return true;
}
void show_result(int n)
{
int i = 0;
cout<<endl<<"----------------------"<<endl;
int index;
for( i=1; i<=n;i++)
{
index = X[i];
cout<<W[index]<<" ";
}
cout<<endl;
}
void select( int sum,int n)
{
//sum前面n-1已求的和。现在判断x[n]取哪个值的下标
int i = 1;
int sumA[N+1] ={0}; //记录当x[n]取的值而导致的和值增加。
for(i=1;i<=N;i++)
{
X[n] = i;
if(checkX(sum,n)) //如果X[n]选择i下标符合规则
{
sumA[i] = sum + W[i];
if( sumA[i] == M )
{
show_result(n);
}
else if( n < MAXNUM)
{
cout<<"select("<< sumA[i]<<","<<n+1<<")"<<endl;
select( sumA[i],n+1 );
}
//else:什么都不做。
}
}
}
void main()
{
select(0,1);
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -