背包问题 ---【解题模板】

背包问题的一些模板(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写的:

传送门

原创文章 12 获赞 7 访问量 507

猜你喜欢

转载自blog.csdn.net/qq_43843951/article/details/104944832
今日推荐