动态规划—背包问题
就在这几天,我看到了一个动态规划的典型题目:
这个题目是动态规划的典型题目——背包问题。其实这个问题十分简单,就是有一个背包,有价值不同,重量不一的物品。问题就是如何将价值最大的物品放满背包且重量刚好。
如图所示:
所以这个问题的程序的状态转移方程是这样的:
1 if(j<w[i])//背包装不下的时候,f为上一个值。 2 { 3 f[i][j]=f[i-1][j]; 4 } 5 else//否则(如果可以拿),使用状态转移方程 6 { 7 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]); 8 }
完整的程序是这样的:
#include <bits/stdc++.h> using namespace std; int f[15][15]; int main() { cout<<"容量"; for(int i=1;i<=12;i++) { cout<<i<<setw(5); } cout<<endl; cout<<"-------------------------------------------------------------------"<<endl;//显得更直观 int v[]={0, 8, 10, 6, 3, 7, 2}; //设定化物品价值数组 int w[]={0, 4, 6, 2, 2, 5, 1}; //设定化物品重量数组 int n=6,c=12; //设定物品数量与背包容量 memset(f,0,sizeof(f));//初始化f for(int i=1;i<=n;i++)//循环列举每一个物品 { for(int j=1;j<=c;j++) { if(j<w[i])//背包装不下的时候,f为上一个值。 { f[i][j]=f[i-1][j]; } else//否则(如果可以拿),使用状态转移方程 { f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]); } } } for(int i=1;i<=n;i++)//输出结果 { for(int j=1;j<=c;j++) { cout<<setw(5)<<f[i][j]; } cout<<endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix