01背包-近似算法

原创 2015年11月18日 16:46:17
void dp2(int *w, int *v, int n, int c){cout<<"dp2:"<<endl;
	int vs = 0;
	for(int i=0;i<n;i++)
		vs += v[i];
	int **m;
	m = new int*[n+1];
	for (int i = 0; i<n + 1; i++) {
		m[i] = new int[vs+1];
		for (int j = 0; j<vs + 1; j++)
			m[i][j]=-1;//2147483647
	}
	for(int i=0;i<n+1;i++) m[i][0] = 0;
	m[1][v[0]] = w[0];
	for(int i=2;i<=n;i++){
		for(int j=1;j<=vs;j++){
			if(j<v[i-1])
				m[i][j] = m[i-1][j];
			else{
				int a = m[i-1][j];
				int b = m[i-1][j-v[i-1]];
				if(b==-1){
					m[i][j] = a;
				}
				else{
					b += w[i-1];
					if(a==-1||b<a) m[i][j] = b;
					else m[i][j] = a;
				}
			}
		}
	}
//	for (int i = 0; i <= n; i++) {
//		for (int j = 0; j <= vs; j++) cout << m[i][j] << "\t";
//		cout << endl;
//	}
	
	int *x;
	x = new int[n+1];
	int maxV=0;
	for(int i=vs;i>0;i--){
		if(m[n][i]<=c&&m[n][i]!=-1){
			maxV = i;
			break;
		}
	}
	for(int i=n;i>0;i--){
		if(m[i][maxV]==m[i-1][maxV]) x[i] = 0;
		else {
			x[i] = 1;
			maxV -= v[i-1];
		}
	}
//	for (int i = 1; i <= n; i++) cout << x[i] << "\t";
	cout << endl;
}
void adp(int *w, int *v, int n, int c,int e){cout<<"adp:"<<endl;
	int k = n/e;
	int vmax = 0;
	for(int i=0;i<n;i++)
		if(vmax<v[i])
			vmax=v[i];
	for(int i=0;i<n;i++)
		v[i] = v[i]*k/vmax;
	dp2(w, v, n, c);
}

01背包问题几种算法实现

最简单的就是利用搜索,把每一种情况都考虑。 //深度搜索。复杂度O(2^n) int dfs(int i,int j) { int res;//剩余的空间量。 if(i==n)res=0;//...
  • ydd97
  • ydd97
  • 2015年01月29日 15:50
  • 1195

贪心算法_01背包问题_Java实现

什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。因此贪心算法不会对所有问题都能得到整体最优解,但对于很...
  • ljmingcom304
  • ljmingcom304
  • 2015年12月15日 09:41
  • 4365

【背包专题】01背包

暑假集训开始了,按照队里的分配,我是弄DP的,嘛,于是我又一次的开始了从01背包开始学习,昨天将杭电的几道01背包重新做了一遍,下面讲讲我自己对于01背包的理解。   首先01背包题目的雏形是 有N件...
  • libin56842
  • libin56842
  • 2013年07月16日 09:53
  • 29314

HDU_01背包系列

HDU 01背包系列持续更新中……
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月22日 12:22
  • 2471

01背包问题 总结关于为什么01背包优化成1维数组后,内层循环是逆序的?

    前言:本人是c语言初学者,能力有限,如果你比较强了,请忽略本文章。。,如果你能多给些指导,那更好啦.  我写这篇文章是因为我在偶然碰到了01背包的题目,而自己太菜,写不出来,于是在...
  • xiajiawei0206
  • xiajiawei0206
  • 2014年02月25日 21:29
  • 1708

回溯法-01背包问题之一:递归模式

一、回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包...
  • chifuqi
  • chifuqi
  • 2014年05月09日 14:48
  • 2377

遗传算法解01背包问题(Java)

遗传算法解01背包问题,并给出了完整可运行的java代码
  • liyuming0000
  • liyuming0000
  • 2015年09月12日 16:26
  • 2769

最通俗易懂的01背包问题讲解

1、动态规划(DP)  动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复...
  • FX677588
  • FX677588
  • 2017年04月02日 14:02
  • 1366

算法课笔记系列(九)——近似算法(Part1)

这一周的内容是近似算法(Approximation Algorithm)。 对于许多的问题的算法,我们通常目标在于设计一个可以在多项式时间内运行的算法。然而,上一节的NP问题告诉我们这样的算法不一定存...
  • Ying_Xu
  • Ying_Xu
  • 2016年06月01日 17:11
  • 6673

01背包状态压缩和记录路径

01背包的状态压缩   当然肯定是看了别人的博客,我再重复一下,大神链接:点击打开链接 1、        在看之前希望你已经弄懂了空间复杂度在O(n*w)的算法,空间的压缩到O(w)的状态,其...
  • Cai_Nia
  • Cai_Nia
  • 2016年12月14日 22:55
  • 926
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01背包-近似算法
举报原因:
原因补充:

(最多只允许输入30个字)