题解 AT4525 【Knapsack 1】
01背包板子题
其实就是背包问题。
一,顺推
1,状态定义
我们不妨设 表示取完第i个物品后,背包装了重量j的物品时的最大价值。因而答案为 。
2,状态转移方程
边界条件:
-
对于第i个物品,可以选择选或不选
选:
不选时:
再比较两种选择取个max值。
3,代码
自己写吧。。。
二,倒推
dp既可以顺推,也可以倒推。
1,状态定义
我们不妨设 表示取完第i个物品后,背包装了重量j的物品时的最大价值。由于是倒推,从最后一个物品开始,往前推,因而答案为 。
2,状态转移方程
边界条件:
-
对于第i个物品,可以选择选或不选
选:
不选时:
再比较两种选择取个max值。
3,代码
#include<iostream> using namespace std; int vi[200],w[100000+10]; long long dp[200][100000+1]; int main(){ int n,v; cin>>n>>v; for(int i = 1; i <= n; i++){ cin>>vi[i]>>w[i]; } for(int i = n; i >= 1; i--){ for(int j = 1; j <= v; j++){ if(j < vi[i]){ dp[i][j] = dp[i+1][j]; } else{ dp[i][j] =max(dp[i+1][j],dp[i+1][j-vi[i]] + w[i]); } } } cout<<dp[1][v]; return 0; }
看懂了吗?希望对您有帮助。
本文作者:WRuperD
本文链接:https://www.cnblogs.com/WRuperD/p/18001919
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通