子集和问题

 

完整程序:

#include<bits/stdc++.h>
using namespace std;
//子集和问题回溯算法
//(1) 子集和问题回溯算法的数据结构
#define NUM 10000
int n;				//集合S中的元素的个数
int c;				//子集和的目标值
int cw;				//当前的子集和
int bestw;			//当前的最优值
int w[NUM];			//存放集合S中的元素
int x[NUM];			//构成当前子集和的元素
int r;				//集合S中剩余的所有元素的和
bool flag;			//获得最优值的标志
//(2) 子集和问题回溯算法的实现
//形参表示搜索第t层结点
void backtrack(int t)
{
  if(t>n)      //到达叶子结点
  {
    //获得最优解
    if(cw==c)
    {
      for(int i=1; i<=n; i++)
        if (x[i]) printf("%d ",w[i]);
      printf("\n");
      flag = false;	//已经有最优值
    }
    return;
  }
//更新剩余的所有元素的和
  r -= w[t];
  if (cw+w[t]<=c)      //搜索左子树
  {
    x[t] = 1;
    cw += w[t];
    backtrack(t+1);
    cw -= w[t];
  }
  if (cw+r>bestw)      //搜索右子树
  {
    x[t] = 0;
    backtrack(t+1);
  }
  r += w[t];          //恢复状态
}
int main(){
//(3)剩余的所有元素的和r初始化
r = 0;
for(int i=1; i<=n; i++)
{
	scanf("%d", &w[i]);
	r += w[i];
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章