⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 子集和问题近似算法.cpp

📁 自己编写的子集和问题的源代码
💻 CPP
字号:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
double t;       
int sum;       
void Trim(vector<int>& vec,double t) // t为修正参数
{
	int m = vec.size();
	vector<int> temp;
	temp.push_back(vec[0]);
	int i,last = vec[0];
	for(i = 1; i < m ; i++)
		if(vec[i] > last*(1 + t) && (vec[i] <= sum)){
			temp.push_back(vec[i]);
			last = vec[i];
		}
	vec = temp;
}

void MergeList(vector<int>& vec1,int x)
{
	int i,j,k = vec1.size();
	for(i = 0; i < k; i++){
		j = vec1[i] + x;
		vec1.push_back(j);
	}
	sort(vec1.begin(),vec1.end());  // 排序
}


vector<int>& ApproxSubsetSum(vector<int>& Sum,vector<int>& f)
{
	int n = Sum.size();
	vector<int> result;
	result.push_back(0);
	int i,j;
	for(i = 0; i < n; i++){
		MergeList(result,Sum[i]);
		Trim(result,t);
	}
	f = result; 
	return f;
	
}



int main()
{
	vector<int> source;
	int n;       // n为原集合大小,m为指定的子集和
	scanf("%d%d%lf",&n,&sum,&t);
	int i,tmp;
	for(i = 0; i < n; i++){
		scanf("%d",&tmp);
		source.push_back(tmp);
	}
	vector<int> res;
	vector<int> f;
	res = ApproxSubsetSum(source,f);
	for(i = 0; i < res.size(); i++)
		printf("%d ",res[i]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -