蓝桥杯 经典算法题 求解完全背包问题

题目:

题解:

和01背包基本完全一样。小局部最优的策略也是一样:是否选当前局部的最后一项。唯一的不同点在于物品是无线的导致在表示选择当前物品的状态写法发生了改变:由dp[i-1][j-w[i]]变为了dp[i][j-w[i]]因为这样能够表示最后一件物品选多件的情况。

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
  int total,N;
  int w[1005]={0},v[1005]={0};
  cin>>total>>N;
  int dp[1005][1005]={0};
  for(int i=1;i<=N;i++)cin>>w[i]>>v[i];
  for(int i=1;i<=N;i++){
    for(int j=0;j<=total;j++){
      dp[i][j]=dp[i-1][j];
      if(j>=w[i])dp[i][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
    }
  }
  cout<<dp[N][total];
  return 0;
}

题后反思:

至于为什么j可以从1开始也可以从0开始我认为这其中因该包含了某种思想,现在我的答案是:

j为0和1的这些情况都小于了物品最的最小重量都只能从i-1得来所以都是0。

但其实这类题目的关键就在于思考清楚通过已有的值(入门后叫做状态)操作得出小局部最优的策略,然后注意初始值的设置递推得出答案即可。

相关推荐
j_xxx404_21 小时前
力扣算法题:字符串(最长公共前缀|最长回文子串)
c++·算法·leetcode
承渊政道21 小时前
【递归、搜索与回溯算法】(穷举vs暴搜vs深搜vs回溯vs剪枝:一文讲清概念与用法)
数据结构·c++·算法·决策树·深度优先·剪枝·宽度优先
承渊政道21 小时前
【递归、搜索与回溯算法】(综合练习:一网打尽常见题型分类总结与方法归纳)
c++·算法·决策树·分类·深度优先·哈希算法·宽度优先
小江的记录本21 小时前
【网络安全】《网络安全与数据安全核心知识体系》(包括数据脱敏、数据加密、隐私合规、等保2.0)
java·网络·后端·python·算法·安全·web安全
SimpleLearingAI21 小时前
ROPE:大模型必学操作
人工智能·算法
zore_c21 小时前
【C++】C++类和对象实现日期类项目——时间计算器!!!
java·c语言·数据库·c++·笔记·算法·排序算法
人道领域1 天前
【LeetCode刷题日记】:344,541-字符串反转字符串反转技巧:双指针原地交换法
算法·leetcode·面试
Crazy________1 天前
4.13docker仓库registry
mysql·算法·云原生·eureka
澈2071 天前
C++ string操作指南:从入门到精通
数据结构·c++·算法
努力长头发的程序猿1 天前
Unity2D当中的A*寻路算法
算法·unity·c#