这篇是接上一篇博客的优化版,如果不清楚题干请阅读上一篇动态规划之背包问题(入门版)(如果刚入门,建议先阅读入门版,有助于理解思想),主要在这里优化的是在空间上,废话不说太多,直接上代码,
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//T 总的背包容量
//M 总的物体个数
//t 每一个物体的体积
//v 每一个物体的价值
int T,M,t[101],v[101];
while(cin>>T>>M)// 输入背包的总容量,和总的个数
{
// 用于记录每个容量的最大价值
int d[1001]={0};
for(int i=1;i<=M;i++)
{
cin>>t[i]>>v[i];// 输入每个物体的体积和价值
}
for(int i=1;i<=M;i++) // 循环遍历每个物体 i代表第几个物体
{
for(int j=T;j>=t[i];j--) // j从最大容量开始递减
{
// 这里只需要考虑到底是放进去价值大,还是不放进去价值大
// 如果返回的d[j] 表示不放进去价值大
// 反之,表示放进去价值大
d[j]=max(d[j],d[j-t[i]]+v[i]);
}
}
cout<<d[T]<<endl;
}
return 0;
}
整段代码可能就这句 d[j]=max(d[j],d[j-t[i]]+v[i]); 语句有点难度,如果真的理解不了,我个人建议拿一个笔把过程写一遍,
只需要写两三轮,你肯定能明白,我也是这样过来的,想要进步,那就勇敢的走出大脑的舒适区