60分。。感觉和题解差不多,我可能就差去粘题解了

P1064 [NOIP2006 提高组] 金明的预算方案

Refun @ 2017-07-10 11:33:20

#include<iostream>
#include<cstring>
using namespace std;
long long n,m,smax,w[62],c[62],p[62],f[61][3201],fj[62][3][3];
int pd[162];
int main()
{
    int i,j,s;
    cin>>n>>m;
    s=0;
    n=n/10;
    int x,y,z;
    for (i=1;i<=m;++i)
    {
        cin>>x>>y>>z;
        x=x/10;
        y=y*x;
        if (z==0)
        {
            ++s;
            w[s]=x;
            c[s]=y;
        }
        else 
        {
                ++pd[z];
                fj[z][pd[z]][1]=x;
                fj[z][pd[z]][2]=y;
        }
    }
    for (i=1;i<=s;++i)
        for (j=n;j>0;--j)
        {
            if (j-w[i]>=0) f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]);
            else
                f[i][j]=f[i-1][j];
            if (j-w[i]-fj[i][1][1]>=0)    f[i][j]=max(f[i][j],f[i-1][j-w[i]-fj[i][1][1]]+c[i]+fj[i][1][2]);
            if (j-w[i]-fj[i][2][1]>=0)     f[i][j]=max(f[i][j],f[i-1][j-w[i]-fj[i][2][1]]+c[i]+fj[i][2][2]);
            if (j-w[i]-fj[i][2][1]-fj[i][1][1]>=0)     f[i][j]=max(f[i][j],f[i-1][j-w[i]-fj[i][1][1]-fj[i][2][1]]+c[i]+fj[i][1][2]+fj[i][2][2]);
        }    
    cout<<f[s][n]*10;
}

by 宽嫂 @ 2017-07-10 14:28:23

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!

怒膜褚dalao


by ttgan @ 2017-07-10 16:10:22

我没有看题,不知道怎么做


by 宽嫂 @ 2017-07-10 16:56:59

您看到这句话了吗“每个主件可以有0个、1个或2个附件”

我还以为可以有无穷多个附件....


by 宽嫂 @ 2017-07-10 17:41:01

用记忆化搜索是大概这个样子(然而错了)...

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define max(x,y) ((x)>(y)?(x):(y))
#define MAXM (60+5)
#define MAXN (32000+5)
using namespace std;
struct chu
{
    int c;
    int q;
    int w;
//    int bh;
} a[MAXM];
vector<int> v[MAXM];
//bool vis[MAXM];
int f[MAXN];
int ans;
int n;
int m;
//bool v[MAXM];
int dfs(int,int);
/*bool cmp(chu xxx,chu yyyy)
{
    return xxx.q<yyyy.q;
}*/
inline int read()
{
    int re=0;
    char x=0;
    while(x<'0'||x>'9')
        x=getchar();
    while(x>='0'&&x<='9')
    {
        re*=10;
        re+=(x-'0');
        x=getchar();
    }
    return re;
}
int main()
{
//    memset(vis,false,sizeof(vis));
    memset(f,0,sizeof(f));
    n=read();
    m=read();
//    printf("%d %d",n,m);
//    scanf("%d%d",&n,&m);
    int srp;
//    int dm=m;
    for(int i=1; i<=m; i++)
    {
        v[i].clear();
    }
    for(int i=1; i<=m; i++)
    {
        a[i].c=read();
        srp=read();
        a[i].q=read();
        if(a[i].q)
        {
            v[a[i].q].push_back(i);
        }
//        scanf("%d%d%d",&a[i].c,&srp,&a[i].q);
        a[i].w=srp*a[i].c;
//        a[i].bh=i;
    }
//    sort(a+1,a+m+1,cmp);
    ans=dfs(1,n);
    for(int i=0; i<=n; i++)
    {
        ans=max(ans,f[i]);
    }
    printf("%d",ans);
    return 0;
}
int dfs(int dq,int mon)
{
    if(dq>m)
    {
        return 0;
    }
    if(a[dq].q)
    {
        return dfs(dq+1,mon);
    }
    else
    {
//            v[a[dq].bh]=true;
//            vis[dq]=true;
        if(mon>=a[dq].c)
            f[mon]=max(f[mon],(f[mon-a[dq].c]?(f[mon-a[dq].c]+ a[dq].w):(dfs(dq+1,mon-a[dq].c)+a[dq].w)));
        if(v[dq].size()>=1&&mon>=(a[v[dq][0]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][0]].c-a[dq].c]?f[mon-a[v[dq][0]].c-a[dq].c]:dfs(dq+1,mon-a[v[dq][0]].c-a[dq].c))+a[v[dq][0]].w+a[dq].w,f[mon]);
        if(v[dq].size()>=2&&mon>=(a[v[dq][1]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][1]].c-a[dq].c]?f[mon-a[v[dq][1]].c-a[dq].c]:dfs(dq+1,mon-a[v[dq][1]].c-a[dq].c))+a[v[dq][1]].w+a[dq].w,f[mon]);
        if(v[dq].size()>=2&&mon>=(a[v[dq][0]].c+a[v[dq][1]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c]?f[mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c]:dfs(dq+1,mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c))+a[v[dq][1]].w+a[dq].w+a[v[dq][0]].w,f[mon]);
//            v[a[dq].bh]=false;
//        f[dq][mon]=max(f[mon],(f[mon]?f[mon]:dfs(dq+1,mon)));
    }
    return f[mon];
}

循环的话大概是这个样子(对了)...

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define max(x,y) ((x)>(y)?(x):(y))
#define MAXM (60+5)
#define MAXN (32000+5)
using namespace std;
struct chu
{
    int c;
    int q;
    int w;
//    int bh;
} a[MAXM];
vector<int> v[MAXM];
//bool vis[MAXM];
int f[MAXN];
int ans;
int n;
int m;
//bool v[MAXM];
int dfs(int,int);
/*bool cmp(chu xxx,chu yyyy)
{
    return xxx.q<yyyy.q;
}*/
inline int read()
{
    int re=0;
    char x=0;
    while(x<'0'||x>'9')
        x=getchar();
    while(x>='0'&&x<='9')
    {
        re*=10;
        re+=(x-'0');
        x=getchar();
    }
    return re;
}
int main()
{
//    memset(vis,false,sizeof(vis));
    memset(f,0,sizeof(f));
    n=read();
    m=read();
//    printf("%d %d",n,m);
//    scanf("%d%d",&n,&m);
    int srp;
//    int dm=m;
    for(int i=1; i<=m; i++)
    {
        v[i].clear();
    }
    for(int i=1; i<=m; i++)
    {
        a[i].c=read();
        srp=read();
        a[i].q=read();
        if(a[i].q)
        {
            v[a[i].q].push_back(i);
        }
//        scanf("%d%d%d",&a[i].c,&srp,&a[i].q);
        a[i].w=srp*a[i].c;
//        a[i].bh=i;
    }
//    sort(a+1,a+m+1,cmp);
//    ans=dfs(1,n);
    for(int i=1; i<=m; i++)
    {
        if(a[i].q)
        continue;
        for(int j=n; j>=a[i].c; j--)
        {
            f[j]=max(f[j],f[j-a[i].c]+a[i].w);
            if(v[i].size()>=1&&j>=(a[v[i][0]].c+a[i].c))
                f[j]=max(f[j],f[j-a[v[i][0]].c-a[i].c]+a[i].w+a[v[i][0]].w);
            if(v[i].size()>=2&&j>=(a[v[i][1]].c+a[i].c))
                f[j]=max(f[j],f[j-a[v[i][1]].c-a[i].c]+a[i].w+a[v[i][1]].w);
            if(v[i].size()>=2&&j>=(a[v[i][0]].c+a[v[i][1]].c+a[i].c))
                f[j]=max(f[j],f[j-a[v[i][0]].c-a[v[i][1]].c-a[i].c]+a[i].w+a[v[i][0]].w+a[v[i][1]].w);
        }
    }
    for(int i=0; i<=n; i++)
    {
        ans=max(ans,f[i]);
    }
    printf("%d",ans);
    return 0;
}
/*int dfs(int dq,int mon)
{
    if(dq>m)
    {
        return 0;
    }
    if(a[dq].q)
    {
        return dfs(dq+1,mon);
    }
    else
    {
//            v[a[dq].bh]=true;
//            vis[dq]=true;
        if(mon>=a[dq].c)
            f[mon]=max(f[mon],(f[mon-a[dq].c]?(f[mon-a[dq].c]+ a[dq].w):(dfs(dq+1,mon-a[dq].c)+a[dq].w)));
        if(v[dq].size()>=1&&mon>=(a[v[dq][0]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][0]].c-a[dq].c]?f[mon-a[v[dq][0]].c-a[dq].c]:dfs(dq+1,mon-a[v[dq][0]].c-a[dq].c))+a[v[dq][0]].w+a[dq].w,f[mon]);
        if(v[dq].size()>=2&&mon>=(a[v[dq][1]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][1]].c-a[dq].c]?f[mon-a[v[dq][1]].c-a[dq].c]:dfs(dq+1,mon-a[v[dq][1]].c-a[dq].c))+a[v[dq][1]].w+a[dq].w,f[mon]);
        if(v[dq].size()>=2&&mon>=(a[v[dq][0]].c+a[v[dq][1]].c+a[dq].c))
            f[mon]=max((f[mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c]?f[mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c]:dfs(dq+1,mon-a[v[dq][1]].c-a[dq].c-a[v[dq][0]].c))+a[v[dq][1]].w+a[dq].w+a[v[dq][0]].w,f[mon]);
//            v[a[dq].bh]=false;
//        f[dq][mon]=max(f[mon],(f[mon]?f[mon]:dfs(dq+1,mon)));
    }
ret…

by xMinh @ 2017-07-13 19:56:08

%褚佬


|