输入:

n=3

(w,v)={(3,4),(4,5),(2,3)}

W=7

输出:

10(0号物品选1个,2号物品选2个)

和01背包的区别是物品可以任意选择.

令dp[i+1][j]=从前i种物品中挑选任意总重量不超过j时总价值的最大值.那么递推关系为:

dp[0][j]=0

dp[i+1][j]=max{dp[i-k*w[i]]+k*v[i]|0<=k}

=max{dp[i][j-k*w[i]]+k*v[i]|0<=k}

 int dp[MAX][MAX];  //DP数组

 void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
for(int k=; k*w[i]<=j; k++){
dp[i+][j]=max(dp[i+][j],dp[i][j-k*w[i]]+k*v[i]);
}
}
}
printf("%d\n",dp[n][m]);
}

复杂度为:O(nW2)

修改后:

 void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
if(j<w[i]){
dp[i+][j]=dp[i][j];
}
else{
dp[i+][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}

复杂度:O(nW)

当然,01背包和完全背包可以通过不断重复利用一个数组来实现.

01背包问题的情况:

 int dp[MAX];  //DP数组

 void solve()
{
for(int i=; i<n; i++){
for(int j=W; j>=w[i]; j--){
dp[i]=max(dp[j],dp[j-w[i]+v[i]]);
}
}
printf("%d\n",dp[W]);
}

完全背包问题的情况:

 int dp[MAX];  //DP数组

 void solve()
{
for(int i=; i<n; i++){
for(int j=w[i]; j<=W; j++){
dp[i]=max(dp[j],dp[j-w[i]+v[i]]);
}
}
printf("%d\n",dp[W]);
}

两者的差异就变成只有循环方向.重复利用数组虽然可以节省内存空间,但是得不好将有可能留下bug,所以要格外小心.不过出于节约内存的考虑,有时候必须要重读利用数组.也存在通过重复利用能够进一步降低复杂度的问题.

DP数组的再利用:

可以通过讲两个数组滚动使用来实现重复利用.

dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i])

dp[i+1]计算时只需要dp[i]和dp[i+1],所以可以结合奇偶性写成如下形式:

 int dp[][MAX];  //DP数组

 void solve()
{
for(int i=; i<n; i++){
for(int j=; j<=W; j++){
if(j<w[i]){
dp[(i+)&][j]=dp[i&][j];
}
else{
dp[(i+)&][j]=max(dp[i&][j],dp[(i+)&][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n&[W]);
}

<<挑战程序设计竞赛>>读后感

最新文章

  1. java-w3c.document生成xml文件
  2. 将windows server 2016改造为像windows 10一样适合个人使用的系统
  3. linux command screen
  4. extjs grid renderer用法
  5. Core Java Volume I — 4.4. Static Fields and Methods
  6. 解决SQLite数据库中文乱码问题
  7. Oracle RAC 11gR2 修改本地及SCAN监听端口
  8. DataGridView单元格合并
  9. FilterDispatcher已被标注为过时解决办法
  10. docker private registry使用
  11. 关于jquery的$each((Object, function(p1, p2)用法
  12. 代码规范--捡拾(SQL语句)
  13. JS滚动显示
  14. 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置
  15. React基础知识备忘
  16. skyline添加wfs服务时,弹出错误“no layers were found”!
  17. IDEA 在使用的过程中字符间距变大的问题
  18. iOS - DNS劫持
  19. 批量增删改&quot;_bulk&quot;
  20. 3D-爱心

热门文章

  1. SqlServer表EXCEL数据复制的另一种方法
  2. 【原创】纯OO:从设计到编码写一个FlappyBird (三)
  3. linux、hdfs、hive、hbase经常使用的命令
  4. 【转】HLSL基础
  5. GLEW_ERROR_NO_GL_VERSION的解决方法
  6. 关于WCF的引用,添加服务和添加web服务的区别
  7. POJ 2217 Secretary (后缀数组)
  8. Android应用开发:LoaderManager在Activity/Fragment中的使用分析
  9. wpf 9张图片的连连看
  10. PKU A Simple Problem with Integers (段树更新间隔总和)