题解 | #购物单#

购物单

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

一开始把题目想复杂了,没看到最多只有两个附件,只有两个附件的话,购买一个主件最多有四种情况

/***HJ16购物单***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    enum{price, importance, master, adj1, adj2}; //用枚举变量代表下表,省的后面需要看不同下表代表啥
    int N, m;
    scanf(" %d %d", &N, &m);
    N /= 10;
    int list[m+1][5]; //这里将数组从3个扩大至5个,后两个用于存储附件位置,方便后面扫描物品时进行计算
    memset(list, 0, sizeof(list));
    int i, j, k;
    //这里考虑主件可能会在附件之后输入,因此先读完数据之后再进行处理
    for(i = 1; i <= m; i++){
        scanf(" %d %d %d", &list[i][price], &list[i][importance], &list[i][master]);
        list[i][price] /= 10;
        list[i][importance] *= list[i][price];
        if(list[i][master]) list[list[i][master]][list[list[i][master]][adj1] ? adj2 : adj1] = i;
    }

    int dp[N+1], sum[4][2], count, child1, child2;
    memset(dp, 0, sizeof(dp));
    for(i = 1; i <= m; i++){
        memset(sum, 0, sizeof(sum));
        count = 0;
        if(list[i][master]) continue;
        sum[count][price] = list[i][price];
        sum[count][importance] = list[i][importance];
        count++;
        child1 = list[i][adj1];
        child2 = list[i][adj2];
        if(child1 && list[child1][price]+list[i][price] <= N){
            sum[count][price] = list[child1][price]+list[i][price];
            sum[count][importance] = list[child1][importance]+list[i][importance];
            count++;
        }
        if(child2 && list[child2][price]+list[i][price] <= N){
            sum[count][price] = list[child2][price]+list[i][price];
            sum[count][importance] = list[child2][importance]+list[i][importance];
            count++;
        }
        if(child1 && child2 && list[child1][price]+list[child2][price]+list[i][price] <= N){
            sum[count][price] = list[child1][price]+list[child2][price]+list[i][price];
            sum[count][importance] = list[child1][importance]+list[child2][importance]+list[i][importance];
            count++;
        }
        for(j = N; j > 0; j--){
            for(k = 0; k < count; k++){
                if(j >= sum[k][price]) dp[j] = dp[j] > dp[j-sum[k][price]]+sum[k][importance] ? dp[j] : dp[j-sum[k][price]]+sum[k][importance];
            }
        }
    }
    printf("%d", dp[N]*10);
    return 0;
}
全部评论

相关推荐

本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
牛客266927136号:为啥实习经历写这么少,项目经历反而大写特写,最重要的还是实习经历吧,写具体点,什么场景下做了什么事,解决了什么问题,优化了什么场景,性能提升了多少多少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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