您的位置:首页 > 其它

[01背包]NOIP 2005 PJ T3 采药 + 01背包的空间优化

2014-03-22 23:19 471 查看
原题:https://www.vijos.org/p/1104

时间:2014.3.22

类型:01背包

源码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[101],c[101],f[101][10001];

int max(int x,int y)
{
if(x>y) { return x; }
else { return y; }
}

int main()
{
int t,m;
scanf("%d %d",&t,&m);
for(int i=1;i<=m;i++) { scanf("%d %d",&a[i],&c[i]); }
for(int i=1;i<=m;i++)
{
for(int j=t;j>=1;j--)
{
if(a[i]<=j)
{
f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+c[i]);
}
else { f[i][j]=f[i-1][j]; }
}
}
printf("%d",f[m][t]);
system("pause");
return 0;
}


最后状态:AC

优化:

当我们算到f[i][j]的时候,f[i-2][...]已经没用了,那么怎么节省呢?

for(int i=1;i<=m;i++)
{
for(int j=t;j>=a[i];j--)
{
f[j]=max(f[j],f[j-a[i]]+c[i]);
}
}

这样优化即可,f[i]表示容积为i时的最大价值,注意j>=a[i],不然j-a[i]会<0,就错了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 01背包