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

题目:

题解:

和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。

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

相关推荐
Codeking__几秒前
”一维前缀和“算法原理及模板
数据结构·算法
休息一下接着来1 分钟前
C++ 条件变量与线程通知机制:std::condition_variable
开发语言·c++·算法
Code哈哈笑14 分钟前
【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
人工智能·算法·机器学习·回归·svm
努力学习的小廉25 分钟前
【C++】 —— 笔试刷题day_29
开发语言·c++·算法
小羊在奋斗27 分钟前
【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值
算法·leetcode·职场和发展
meisongqing33 分钟前
【软件工程】符号执行与约束求解缺陷检测方法
人工智能·算法·软件工程·软件缺陷
莫叫石榴姐1 小时前
如何为大模型编写优雅且高效的提示词?
人工智能·算法
Echo``2 小时前
1:OpenCV—图像基础
c++·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
COOCC13 小时前
激活函数全解析:定义、分类与 17 种常用函数详解
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·自然语言处理
林下清风~3 小时前
力扣hot100——347.前K个高频元素(cpp手撕堆)
算法·leetcode·职场和发展