题目:第一行输入两个整数T,M,T代表可用的总时间,M代表共有几株草药,求在T时间内采到药的最高价值。
解题思路:每种草药都可以选择采或者不采,用f数组存采药的价值。所以通过循环(i从1—n)比较f[j-a[i]]+b[i]与f[j]的大小选最大的到最后得到的即是最大价值。
细节处理:此问题为0-1背包问题,通过空间优化将二维数组变成一维数组。
代码:#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,m,a[101],b[101],i,j,f[1002]={0};
cin>>t>>m;
for(i=1;i<=m;i++)
cin>>a[i]>>b[i];
for(i=1;i<=m;i++)
{
for(j=t;j>=a[i];j--)
if(f[j-a[i]]+b[i]>f[j])
f[j]=f[j-a[i]]+b[i];}
cout<<f[t]<<endl;
return 0;
}
感想:0-1背包问题方法很固定,所以判断出来是0-1背包问题的时候就很好处理问题了。