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

来源:互联网 发布:游族网络林奇2017 编辑:程序博客网 时间:2024/05/19 10:12

原题: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,就错了

0 0