题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

#include <stdio.h>

typedef struct{
    int v,p;
    int f1,f2;
    int flag;
}node;

int max(int a,int b){
    if(a>b)return a;
    else return b;
}

int main() {
    int n,m,v,p,q;
    int i,j;
    int dp[60][32000];
    node goods[60];
    for(i=0;i<60;i++){
        goods[i].f1=-1;
        goods[i].f2=-1;
        goods[i].flag=0;
    }
    scanf("%d %d",&n,&m);
    for(i=0;i<m;i++){
        scanf("%d %d %d",&v,&p,&q);
        goods[i].v=v;
        goods[i].p=v*p;
        if(q==0){
            goods[i].flag=1;
        }
        else{
            if(goods[q-1].f1==-1){
                goods[q-1].f1=i;
            }
            else{
                goods[q-1].f2=i;
            }
        }
    }
    for(i=1;i<=m;i++){
        for(j=0;j<=n;j++){
            dp[i][j]=dp[i-1][j];
            if(goods[i-1].flag==0){
                continue;
            }
            if(j>=goods[i-1].v){
                dp[i][j]=max(dp[i][j],dp[i-1][j-goods[i-1].v]+goods[i-1].p);
            }
            if(goods[i-1].f1!=-1&&j>=goods[i-1].v+goods[goods[i-1].f1].v){
                dp[i][j]=max(dp[i][j],dp[i-1][j-goods[i-1].v-goods[goods[i-1].f1].v]+goods[i-1].p+goods[goods[i-1].f1].p);
            }
            if(goods[i-1].f2!=-1&&j>=goods[i-1].v+goods[goods[i-1].f2].v){
                dp[i][j]=max(dp[i][j],dp[i-1][j-goods[i-1].v-goods[goods[i-1].f2].v]+goods[i-1].p+goods[goods[i-1].f2].p);
            }
            if(goods[i-1].f1!=-1&&goods[i-1].f2!=-1&&j>=goods[i-1].v+goods[goods[i-1].f1].v+goods[goods[i-1].f2].v){
                dp[i][j]=max(dp[i][j],dp[i-1][j-goods[i-1].v-goods[goods[i-1].f1].v-goods[goods[i-1].f2].v]+goods[i-1].p+goods[goods[i-1].f1].p+goods[goods[i-1].f2].p);
            }
        }
    }
    printf("%d",dp[m][n]);
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务