60!改不出来错

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

zz4477 @ 2018-11-07 21:35:28

#include<iostream>
#include<cstdlib>
using namespace std;
int f[1000000];
int sum=0;
int p[800][3],v[800][3];
int main()
{
    int n,m,a,b,c;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        if(!c)
        {           
            p[++sum][0]=a/10;
            v[sum][0]=a*b;
        }
        else 
        {
            if(!p[c][1])
            {
                p[c][1]=a/10;
                v[c][1]=a*b;
            }
            else 
            {
                p[c][2]=a/10;
                v[c][2]=a*b;
            }
        }
        //system("pause");
    }
    n/=10;
/*  for(int i=1;i<=sum;i++)
    {
        cout<<p[i][0]<<" "<<p[i][1]<<" "<<p[i][2]<<endl;
        cout<<v[i][0]<<" "<<v[i][1]<<" "<<v[i][2]<<endl;
    }*/
    for(int i=1;i<=sum;i++)
    {
        for(int j=n;j>=p[i][0];j--)
        {
            if(j>=p[i][0]) f[j]=max(f[j],f[j-p[i][0]]+v[i][0]);
            if(j>=p[i][0]+p[i][1]) f[j]=max(f[j],f[j-p[i][0]-p[i][1]]+v[i][0]+v[i][1]);
            if(j>=p[i][0]+p[i][2]) f[j]=max(f[j],f[j-p[i][0]-p[i][2]]+v[i][0]+v[i][2]);
            if(j>=p[i][1]+p[i][2]+p[i][0]) f[j]=max(f[j],f[j-p[i][0]-p[i][2]-p[i][1]]+v[i][0]+v[i][2]+v[i][1]);
        }
    }
    cout<<f[n]<<endl;
    return 0;
}

by WA鸭鸭 @ 2018-11-07 21:37:51

@zz4477 您和楼下撞头像


by 冬瓜皮 @ 2018-11-07 21:39:30

@WA鸭鸭 ?(跑


by WA鸭鸭 @ 2018-11-07 21:41:56

@冬瓜皮 不是,帖子楼主


by 冬瓜皮 @ 2018-11-07 21:44:43

@WA鸭鸭 2333


by 一只蓝久 @ 2018-11-07 21:46:48

您和我撞头像了


by 一只蓝久 @ 2018-11-07 21:46:53

QWQ


by zz4477 @ 2018-11-07 21:51:50

@一只蓝久随便找的..


by limi_sanhua @ 2018-11-07 22:20:15

@zz4477 因为主件不能那样子标序号


by limi_sanhua @ 2018-11-07 22:21:25

@zz4477 题目是所有主件附件都有序号,你那个就成了只有主件有序号了,


by limi_sanhua @ 2018-11-07 22:29:40

@zz4477

#include<bits/stdc++.h>
using namespace std;
int f[1000000];
int sum=0;
int p[1000][3],v[1000][3];
int flag[1000];//加个flag标记那些序号是主件 的序号 
int main()
{
    int n,m,a,b,c;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        if(!c)
        {           
            p[i][0]=a/10;
            v[i][0]=a*b;
            flag[i]=1;//标记这个序号为主件 
        }
        else 
        {
            if(!p[c][1])
            {
                p[c][1]=a/10;
                v[c][1]=a*b;
            }
            else 
            {
                p[c][2]=a/10;
                v[c][2]=a*b;
            }
        }
    }
    n/=10;
    for(int i=1;i<=m;i++)
    {
        if(!flag[i])continue;//没被标记为主件则是附件,跳过 
        for(int j=n;j>=p[i][0];j--)
        {
            f[j]=max(f[j],f[j-p[i][0]]+v[i][0]);
            if(j>=p[i][0]+p[i][1]) f[j]=max(f[j],f[j-p[i][0]-p[i][1]]+v[i][0]+v[i][1]);
            if(j>=p[i][0]+p[i][2]) f[j]=max(f[j],f[j-p[i][0]-p[i][2]]+v[i][0]+v[i][2]);
            if(j>=p[i][1]+p[i][2]+p[i][0]) f[j]=max(f[j],f[j-p[i][0]-p[i][2]-p[i][1]]+v[i][0]+v[i][2]+v[i][1]);
        }
    }
    cout<<f[n]<<endl;
    return 0;
}

| 下一页