1.问题
求解装载问题(01背包):给定 n 个 w i 的集装箱和有最大装载量C 的轮船,问最多能装几个集装箱?
2.解析
01背包问题和完全背包问题其实是差不多的,主要就是一个资源可以无限选,一个只能选择一次的问题,核心还是选与不选的问题,同时考虑选和不选之间的最大利益。主要思想可以参考之前的博客。
链接:https://blog.csdn.net/Theseus_sky/article/details/116947491?spm=1001.2014.3001.5502
链接:https://blog.csdn.net/Theseus_sky/article/details/117457582?spm=1001.2014.3001.5502
附上老师的解析:
3.设计
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
if(j>=w[i]){
//选与不选,选择总价值最大的一种
// cout<<m[i-1][j]<<" "<<m[i-1][j-w[i]]+v[i]<<endl;
m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
}
else{
//重量不够
//cout<<m[i-1][j]<<endl;
m[i][j]=m[i-1][j];
}
}
}
4.分析
时间复杂度为 O(n*c)
而贪心法需要先排序之后选择小的先装,所以排序的复杂度为O(nlogn),遍历为O(n),所以总时间复杂度为O(nlogn)
5.源码
https://github.com/Chenzh0205/Algorithm/tree/main/%E4%BD%9C%E4%B8%9A10