20分求助!!

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

利刃随人 @ 2019-10-15 10:47:12

RT,思路应该看了一遍大家都明白,实现的时候跑出问题了,怎么检查也检查不出来=-=求大佬救救孩子!!

#include<iostream>
#include<cstdio>
#define maxm 61
#define maxn 32001
using namespace std;
struct Item{
    int price,good;
    bool fs;
}it[maxm];
int fs[maxm][3],f[maxn],ans;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        it[i].price=x;
        it[i].good=y;
        if(z>0)
        {
            it[i].fs=true;
            for(int j=1;j<=2;j++)
            {
                if(fs[z][j]) continue;
                fs[z][j]=i;
            }
        }
    }
    for(int i=1;i<=m;i++)
        for(int j=n;j>=it[i].price;j--)
        {
            if(it[i].fs) continue;
            f[j]=max(f[j],f[j-it[i].price]+it[i].price*it[i].good);
            if(j>=it[i].price+it[fs[i][1]].price)
                f[j]=max(f[j],f[j-it[i].price-it[fs[i][1]].price]+it[i].price*it[i].good+it[fs[i][1]].price*it[fs[i][1]].good);
            if(j>=it[i].price+it[fs[i][2]].price)
                f[j]=max(f[j],f[j-it[i].price-it[fs[i][2]].price]+it[i].price*it[i].good+it[fs[i][2]].price*it[fs[i][2]].good);
            if(j>=it[i].price+it[fs[i][1]].price+it[fs[i][2]].price)
                f[j]=max(f[j],f[j-it[i].price-it[fs[i][1]].price-it[fs[i][2]].price]+it[i].price*it[i].good+it[fs[i][2]].price*it[fs[i][2]].good+it[fs[i][1]].price*it[fs[i][1]].good);
        }
    printf("%d",f[n]);
    return 0;
}

by 利刃随人 @ 2019-10-15 11:07:29

已经知道了=-= 在维护fs[][]的时候少加了一句break;

加了就A了。

完成成就:查错1小时,添加一句话


|