悬关,求调

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

48WangYanJi @ 2023-10-27 17:40:54

4~9WA,代码如下:

#include<bits/stdc++.h>
using namespace std;
struct goo{
    int v,p,fo=0;//价格,价值,附件数
};
int main()
{
    int n,m;
    cin>>n>>m;
    int a[n+1];//left
    goo b[m][3];
    for(int i=0;i<=n;i++){
        a[i]=0;
    }
    for(int i=0;i<m;i++){
        int V,W,Q;
        cin>>V>>W>>Q;
        if(Q!=0){
            b[Q-1][b[Q-1][0].fo+1].v=V;
            b[Q-1][b[Q-1][0].fo+1].p=V*W;
            b[Q-1][0].fo++;
            b[i][0].v=-1;
        }else{
            b[i][0].v=V;
            b[i][0].p=V*W;
        }
    }//先按顺序存,空出位置好判定
    for(int i=0;i<m;i++){
        if(b[i][0].v==-1){
            continue;
        }
        for(int k=1;k<=b[i][0].fo;k++){
            b[i][k].v+=b[i][0].v;
            b[i][k].p+=b[i][0].p;//如果买附件,自动买主件(后计算连锁防HACK)
        }
    }
    for(int i=0;i<m;i++){
        if(b[i][0].v==-1){
            continue;
        }
        for(int j=n;j>=0;j--){
            for(int k=0;k<=b[i][0].fo;k++){
                if(j>=b[i][k].v) a[j]=max(a[j],a[j-b[i][k].v]+b[i][k].p);
            }//对于每一套物品,决策不同购买方式
        }
    }
    cout<<a[n];
    return 0;
}

|