1064求助,40分

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

Plum_Steven @ 2023-01-22 16:39:39

#include <iostream>
#include <cstring>
using namespace std;

int ms[61][61]={0}, c[61][61]={0}, dp[32001]={0}, n, m, p=1; 

int main()
{
    int t, mt, ct, sum=0;
    scanf("%d%d", &m, &n);
    //ms(c)[i][0]表示第i个物品一共有几件(附件数+1) 
    for(int i=1;i<=n;i++){
        scanf("%d%d%d", &mt , &ct, &t);
        if(t==0){ //这个是主件 
            sum++;
            ms[p][1] = mt;
            ms[p][0]++;
            c[p][1] = ct*mt;
            c[p][0]++;
//          printf("%d\n", c[t][c[t][0]]); 
            p++;
        }
        else{ //这个是附件 
            ms[t][++ms[t][0]] = mt;
            c[t][++c[t][0]] = ct*mt;
//          printf("%d\n", c[t][c[t][0]]);  
        }

    }
    for(int i=1;i<=n;i++){
        for(int j=m;j>=0;j--){
            if(j>=ms[i][1]){ //只买主件 
                dp[j] = max(dp[j], dp[j-ms[i][1]]+c[i][1]);
            }
            if(ms[i][2]!=0&&j>=(ms[i][1]+ms[i][2])){ //买第一个附件 
                dp[j] = max(dp[j], dp[j-ms[i][1]-ms[i][2]]+c[i][1]+c[i][2]);
            } 
            if(ms[i][3]!=0&&j>=(ms[i][1]+ms[i][3])){ //买第二个附件 
                dp[j] = max(dp[j], dp[j-ms[i][1]-ms[i][3]]+c[i][1]+c[i][3]);
            }
            if(ms[i][2]!=0&&ms[i][3]!=0&&j>=(ms[i][1]+ms[i][2]+ms[i][3])){ //俩附件都买 
                dp[j] = max(dp[j], dp[j-ms[i][1]-ms[i][2]-ms[i][3]]+c[i][1]+c[i][2]+c[i][3]);
            }
        }
    }
    printf("%d", dp[m]);
    return 0;
}

如题,40分,求大佬帮助qwq


by Macw07 @ 2023-02-25 16:56:47

这道题题目没有说清楚,题目中每一个物品对应的主件编号并不是第p个出现的主件,而是第p个出现的物品。

例如:

2000 5
100 3 0
1000 3 1
400 5 0
300 5 0
1400 2 3

这组数据的 1400 2 3 所对应的主件是 400 4 0(第3个出现的物品),而不是 300 5 0(第3个出现的主件)。


|