[usaco3.1.2]inflate

  一开始想把他们分成一件件来做01背包(是在下输了),然后发现直接来一个完全背包就可以了(严重打击自信心),然后再来一个大牛的实用优化(但貌似我写得很拙),看来我还是太年轻了。

/*
ID:abc31261
LANG:C++
TASK:inflate 
*/
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=11111;
long long w[maxn],v[maxn],f[maxn];
int main()
{
    int maxw=0,minv=0x7f,i,j,n,m,l,len=0;
    freopen("inflate.in","r",stdin);
    freopen("inflate.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        ++len;
        scanf("%d%d",&w[len],&v[len]);
        if (w[len]>maxw && v[len]<minv){ maxw=w[len]; minv=v[len];}
           else if (w[len]<=maxw && v[len]>=minv)len--;
    }
    memset(f,0,sizeof(f));
    for (i=1;i<=len;i++)
        for (j=v[i];j<=n;j++)f[j]=max(f[j],f[j-v[i]]+w[i]);
    printf("%d\n",f[n]);
    return 0;
}

 

posted @ 2015-11-30 23:06  Sun_Sea  阅读(198)  评论(0编辑  收藏  举报