标签:最大 div int 复杂 cout 时间复杂度 name memset main
---恢复内容开始---
#include<bits/stdc++.h>
using namespace std;
int a[30050],b[30050];
int mp[30050];
int n,i,tmp,m,j;
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(mp,0,sizeof(mp));
for(i=1;i<=m;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
//m[i][j] 表示在面对第i件物品,且背包容量为 j时所能获得的最大价值
// //时间复杂度O(N * M),空间复杂度也为O(N * M)
// for(i=1;i<=m;i++)//物品
// {
// for(j=0;j<=n;j++)//资源
// {
// if(j>=a[i])mp[i][j]=max(mp[i-1][j],mp[i-1][j-a[i]]+a[i]*b[i]);
// else mp[i][j]=mp[i-1][j];
// }
//
// }
//空间复杂度也为O(N)
for(i=1;i<=m;i++)//物品
{
for(j=n;j>=0;j--)//钱数
{//利用滚动数组求背包问题最合适的值
if(j-a[i]>=0) mp[j]=max(mp[j],mp[j-a[i]]+a[i]*b[i]);
}
}
cout<<mp[n]<<endl;
}
return 0;
}
---恢复内容结束---
标签:最大 div int 复杂 cout 时间复杂度 name memset main
原文地址:https://www.cnblogs.com/guanwen769aaaa/p/10124467.html