01背包-近似算法
2015-11-18 16:46
288 查看
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 [i]<=c&&m [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); }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例