子集和問題

 

完整程序:

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

 

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