背包问题的一些模板(java版本)
动态规划中最为典型就是背包问题了,真巧好让我在做题的时候看到了一位dalao吧基础的背包问题都写了出来,蒟蒻的我也学着将背包问题部分一些用java写出来,不过就是为了自己方便看 日后我继续学习不断地补全…
- 01背包问题
/**
* 01背包问题(无优化)
*/
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if( w[i] > j ) {//取与不取,不取就是拿前一个状态的值,取则要比较大小。
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);//状态转移方程
}
}
}
/**
* 01背包(优化) - 一维数组
*/
for (int i = 1; i <= n; i++) {
for (int j = m; j >= 0; j--) {
if ( j >= w[i] ) {
dp2[j] = Math.max(dp2[j], dp2[j-w[i]]+v[i]);
}
}
}
/**
* 常数优化
*/
int sumw = 0, bound;
for(int i = 1; i <= n; i++) {
sumw += w[i];
bound = Math.max(m-sumw,w[i]);
for(int j = m; j >= bound; j--) {
if( j >= w[i] ) {
dp2[j] = Math.max(dp2[j], dp2[j-w[i]]+v[i]);
}
}
}
- 完全背包问题
/**
* 完全背包问题
*/
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if( j >= w[i] ) {
dp2[j] = Math.max(dp2[j], dp2[j-w[i]]+v[i]);
}
}
}
- 多重背包(
这里我还没有写出来)
多重背包还有c++代码可以看一下这个链接dalao写的: