P1064帮忙看一下谢谢大佬,大佬大气!!!

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

xuzhenghao @ 2019-03-03 19:31:00

哪位大佬帮忙看一下哪儿错了谢谢(P1064金明的预算方案) 祝他(她)天天大吉

include <bits/stdc++.h>

using namespace std;

struct Point

{

int v, p;//分别表示价格和重要度 
int attv[3], attp[3];
//attv表示第k个附件的价格,attp表示第k个附件的重要度 
int k;//当前有k个附件 

};

Point a[70];

int n, m, f[40000];

int cnt;//主件的个数

//分五种情况

//1.不选,然后去考虑下一个

//2.选且只选这个主件

//3.选这个主件,并且选附件1

//4.选这个主件,并且选附件2

//5.选这个主件,并且选附件1和附件2.

int max_five(int i, int j)

{

int maxn = 0;

maxn = max (maxn, f[j]);//不选 

if (j - a[i].v >= 0) maxn = max (maxn, f[j - a[i].v] + a[i].v * a[i].p);//如果放得下只选主件 

if (j - a[i].v - a[i].attv[1] >= 0) maxn = max (maxn, f[j - a[i].v - a[i].attv[1]] + a[i].v * a[i].p + a[i].attv[1] * a[i].attp[1]);

//如果放得下只选主件和附件1 

if (j - a[i].v - a[i].attv[2] >= 0 )maxn = max (maxn, f[j - a[i].v - a[i].attv[2]] + a[i].v * a[i].p + a[i].attv[2] * a[i].attp[2]);

//如果放得下只选主件和附件2 

if (j - a[i].v - a[i].attv[1] - a[i].attv[2] >= 0)

    maxn = max (maxn, f[j - a[i].v - a[i].attv[1] - a[i].attv[2]] + a[i].v * a[i].p + a[i].attv[1] * a[i].attp[1] + a[i].attv[2] * a[i].attp[2]);

    //如果放得下选主件、附件1和附件2 

return maxn;

}

int main ()

{

cin >> n >> m;//输入 

for (int i = 1; i <= m; i++)

{

    int x, y, z;

    cin >> x >> y >> z;

    if (z == 0)

    {

        cnt++;

        a[cnt].v = x;

        a[cnt].p = y;

    }

    //如果是主件,就放入第cnt个主件中 

    else

    {

        a[z].k++;

        a[z].attv[a[z].k] = x;

        a[z].attp[a[z].k] = y;

    }

    //如果是附件,就放入第cnt个主件中的附件中 

}

for (int i = 1; i <= m; i++)

{

    for (int j = 0; j <= cnt; j++)

    {

        f[j] = max_five (i, j);

    }

}

for (int i = 1; i <= cnt; i++) cout << f[i] 
<< " "; 

cout << f[cnt] << endl;

return 0;

}


by xuzhenghao @ 2019-03-03 19:31:35

谢谢大佬们点进这个帖子


by aminoas @ 2019-03-03 19:32:10

希望更丰富的展现?使用Markdown


by xuzhenghao @ 2019-03-03 19:32:46

点进来的人不是帅哥就是美女

天天有人向你表白

一定能追到心仪的对象


by Chara·Fun·Foxy @ 2019-03-03 19:37:55

#include <cstdio>
#include <cstring>
using namespace std;
int f[32010],v[70],q[70],p[70],v1[70],q1[70],v2[70],q2[70];
int mymax(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(f,-1,sizeof(f));
    memset(q,0,sizeof(q));
    memset(q1,0,sizeof(q1));
    memset(q2,0,sizeof(q2));
    memset(v,0,sizeof(v));
    memset(v1,0,sizeof(v1));
    memset(v2,0,sizeof(v2));
    f[0]=0;
    for (int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if (c==0)
        {
            v[i]=a;q[i]=b; 
        }    
        else 
        {
            if (q1[c]==0) {q1[c]=b;v1[c]=a;}
            else {q2[c]=b;v2[c]=a;}
        }
    }    
    for (int i=1;i<=m;i++)
    {
        for (int j=n;j>=v[i];j--)
        {
            {
                if (j-v[i]>=0) f[j]=mymax(f[j],f[j-v[i]]+v[i]*q[i]);//只买一个主件
                if (j-v[i]-v1[i]>=0) f[j]=mymax(f[j],f[j-v[i]-v1[i]]+v[i]*q[i]+v1[i]*q1[i]);//买主件和附件一
                if (j-v[i]-v2[i]>=0) f[j]=mymax(f[j],f[j-v[i]-v2[i]]+v[i]*q[i]+v2[i]*q2[i]);//买主件和附件二
                if (j-v[i]-v1[i]-v2[i]>=0) f[j]=mymax(f[j],f[j-v[i]-v1[i]-v2[i]]+v[i]*q[i]+v1[i]*q1[i]+v2[i]*q2[i]);//买主件和两个附件
            }
        }
    }
    int ans=0;
    for (int j=1;j<=n;j++)
    {
        if (f[j]>ans) ans=f[j];
    }
    printf("%d\n",ans);
    return 0;
}

【滑稽】


by Chara·Fun·Foxy @ 2019-03-03 19:39:25

参考一下吧![]()


by Chara·Fun·Foxy @ 2019-03-03 19:42:39

@小Fun·Foxy 耶耶耶


by Chara·Fun·Foxy @ 2019-03-03 19:42:57

@小Fun·Foxy 耶耶耶


by Chara·Fun·Foxy @ 2019-03-03 19:43:07

@小Fun·Foxy 耶耶耶


by aminoas @ 2019-03-03 19:44:17

恶意刷屏者将被禁言


by Chara·Fun·Foxy @ 2019-03-03 19:46:53

怎么删


| 下一页