~~~
void dp(int *w, int *v, int n, int c){
int **m;
m = new int*[n+1];
for (int i = 0; i<n + 1; i++) {
m[i] = new int[c+1];
for (int j = 0; j<c + 1; j++)
m[i][j]=0;
}
for (int i = w[n - 1]; i <= c; i++) m[n][i] = v[n - 1];
for (int i = n - 1; i >= 2; i--){
for (int j = c; j >= 1; j--){
if (j - w[i - 1] >= 0){
int tmp = m[i + 1][j - w[i - 1]] + v[i - 1];
m[i][j] = m[i + 1][j]>tmp ? m[i + 1][j] : tmp;
}
else{
m[i][j] = m[i + 1][j];
}
}
}
if (c >= w[0]) m[1][c] = m[2][c - w[0]] + v[0];
else m[1][c] = m[2][c];
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= c; j++) cout << m[i][j] << "\t";
// cout << endl;
// }
int *x;
x = new int[n+1];
for (int i = 0; i<n + 1; i++) x[i]=0;
if (m[1][c] == m[2][c]) x[1] = 0;
else x[1] = 1;
int j = c;
for (int i = 2; i <n; i++){
if (x[i - 1] == 0){
if (m[i][j] == m[i + 1][j]) x[i] = 0;
else {
x[i] = 1;
}
}
else{
j = j - w[i - 2];
if (m[i][j] == m[i + 1][j]) x[i] = 0;
else {
x[i] = 1;
}
}
}
if (m[n][c] == 0) x[n] = 0;
else x[n] = 1;
// for (int i = 1; i <= n; i++) cout << x[i] << "\t";
cout << endl;
}
~~~
- 前言
- 插入排序
- 归并排序
- 快速排序
- 最长公共子序列
- 斐波那契数列-台阶问题
- 求n*n阶矩阵最大子矩阵阶数
- 01背包
- 整数序列合并问题
- 动态规划算法的一般解题思路
- 01背包-近似算法
- 树搜索策略
- 求数组中的逆序对
- 并行机器最短调度问题
- 随机算法
- 判断两多项式之积是否等于另一多项式
- 顶点覆盖问题
- Apriori算法 (Introduction to data mining)
- 聚类算法-DBSCAN-C++实现
- 聚类算法-K-means-C++实现
- 聚类算法-Hierarchical(MIN)-C++
- 爬山法、分支限界法求解哈密顿环问题
- Best-First求解八数码问题
- Naive Bayesian文本分类器