C++,acwing,2,背包问题
/* acwing,2,背包问题 背包问题描述: 有N件物品和一个容量为V的容器。 第i件物品占用的空间是v[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 */ #include <iostream> #include <vector> int main(){ int N,V;std::cin>>N>>V; std::vector<std::vector<int>> dp(N+1,std::vector<int>(V+1,0)); std::vector<int> spaces(N+1),values(N+1); for(int i = 1;i<=N;++i){ std::cin>>spaces[i]>>values[i]; } //dp是缩写Dynamic Programming,动态规划 //dp[i][j]表示可选物品为前i个物品, 容器容量为j时, 容器内物品的最大价值 //dp[i][j]的值由前置状态决定 //若第i个物品不放入背包, 则相当于可选物品为前i-1个物品,背包空间为j //此时dp[i][j] = dp[i-1][j] //若第i个物品无法放入背包, 即v[i]>j, 与上面情况相同 //dp[i][j] = dp[i-1][j] //若第i个物品放入背包(v[i]<=j), 则相当于先放入第i给物品, 再考虑剩余物品 //相当于可选物品为前i-1个物品,背包空间为j-v[i](v[i]<=j) //dp[i][j] = max(dp[i-1][j],(dp[i-1][j-v[i]]+w[i]) * (v[i]<=j) ), (v[i]<=j) //dp[0][0]=0; //dp[0][j] = 0;dp[i][0] = 0; 因此i,j从1开始 for(int i = 1;i<=N;++i){ for(int j = 1;j<=V;++j){ if(j<spaces[i]){//第i个物品无法放入背包,dp[i][j] = dp[i-1][j] dp[i][j] = dp[i-1][j]; }else{//第i个物品能够放入(有可能放入),取较大值 dp[i][j] = std::max(dp[i-1][j],dp[i-1][j-spaces[i]]+values[i]); } } } std::cout<<dp[N][V]<<std::endl; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现