题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#include <math.h>
#include <stdio.h>
#include <string.h>
int main() {
    int N, m;
    scanf("%d %d",&N,&m);
    int v,t,o;
        int we[60][4] = {0};
    int pr[60][4] = {0};
    for (int i = 0; i<m; i++) {
    scanf("%d %d %d\n",&v,&t,&o);
    if (o == 0) {
    
    we[i][0] = v*t;                 //主体计算
    pr[i][0] = v;
    }
    else if (pr[o-1][1] == 0) {     //第一个附件计算
        we[o-1][1] = v*t;
        pr[o-1][1] = v;
    } else {
        we[o-1][2] = v*t;           //第二个附件计算
        pr[o-1][2] = v;
        we[o-1][3] = v*t + we[o-1][1];//两个个附件一起计算
        pr[o-1][3] = v + pr[o-1][1];
    }  
    }
for (int i = 0; i<m;i++) {
    if (pr[i][0] != 0 || pr[i][1] == 0){
        for (int j = 1; j<4; j++) {
            we[i][j] += we[i][0];       //在附件位置上加主体的值方便后续计算
            pr[i][j] += pr[i][0];
        }
    }
}
int dp[N+1];//开始动态规划,先设置一维数组
memset(dp, 0, sizeof(dp));//数组初始化为0
for (int i = 0; i<m; i++) {
    if (pr[i][0] == 0) continue;//附件不能单独买
    for (int j = N; j>0; j -= 10) {
        for (int k = 0; k<4; k++) {
            if (j >= pr[i][k]) {    //剩余的钱能买下这个设备
                dp[j] = fmax(dp[j], we[i][k]+dp[j-pr[i][k]]);//看时不买的满意度大还是买了的满意度大
            }
        }
    }
}
printf("%d",dp[N]);
    return 0;
}
 查看6道真题和解析
查看6道真题和解析
 投递思朗科技等公司10个岗位
投递思朗科技等公司10个岗位