HJ16 购物单 题解,用蒙特卡洛算法搜索

#include <stdio.h>

#include <stdlib.h>

#include <time.h> // 包含时间库用于种子初始化

struct object

{

    int price;

    int importance;

    int kind;

};

int main() {

    int money, num;

    int satisfaction_max;

    scanf("%d %d",&money, &num);

    struct object *items= (struct object *)malloc(num*3*sizeof(int));

    //储存数据

    for(int i=0;i<num;i++)

    {

        scanf("%d %d %d",&items[i].price,&items[i].importance,&items[i].kind);

    }

   

    //创建求解空间,求解空间为n*n,为1则买这个物品,为0则不

    char ** solveplace=(char **) malloc(num*sizeof(char*));// 动态分配一个 n x n 的二维数组

    //初始化随机数种子

    srand(time(NULL));

    int satisfaction_max_stableCount = 0;//蒙特卡洛算法停止条件

    int satisfaction_max_before=0;

    for(int i=0;i<num;i++)

    {

        solveplace[i]=(char*)malloc(num*sizeof(char));

    }  

    SOLVE:

    //使用随机数创建求解例子

    for(int i=0;i<num;i++)

    {

        for(int j=0;j<num;j++)

        {

            double rand_num = (double)rand() / RAND_MAX; // 生成一个 0 到 1 之间的随机数            

            if(rand_num<0.5)

                solveplace[i][j]=0;

            else

                solveplace[i][j]=1;

        }

    }

    //将不符合附件规定的删除

    for(int i=0;i<num;i++)

    {

        for(int j=0;j<num;j++)

        {

            if(solveplace[i][j]&&items[j].kind)//如果它是附件

            {

                if(solveplace[i][items[j].kind-1]==0)//如果这个附件的主件没有选择

                    solveplace[i][0]=-1;//剔除这个求解,用-1作为标志

            }

        }

    }

    //计算所用的钱,将大于所用钱的的删除

    for(int i=0;i<num;i++)

    {

        if(solveplace[i][0]==-1)

            continue;

        int money_=0;

        for(int j=0;j<num;j++)

        {

            if(solveplace[i][j])

                money_+=items[j].price;

        }

        if(money_>money)//价格超了,删除这个求解

            solveplace[i][0]=-1;

    }

    //寻找剩余可行解中重要值最大的

    for(int i=0;i<num;i++)

    {

        if(solveplace[i][0]==-1)

            continue;

        int satisfaction=0;

        for(int j=0;j<num;j++)

        {

            if(solveplace[i][j])

                satisfaction+=items[j].price*items[j].importance;

        }

        if(satisfaction>satisfaction_max)

            satisfaction_max = satisfaction;

    }

    if(satisfaction_max==satisfaction_max_before)

        satisfaction_max_stableCount++;

    satisfaction_max_before = satisfaction_max;

    //蒙特卡洛算法停止判断

    if(satisfaction_max_stableCount<100000)

    {

        goto SOLVE;

       

    }

    else

        printf("%d",satisfaction_max);

    return 0;

}

全部评论

相关推荐

一面1.&nbsp;go基本八股,有线程和协程的区别(我答的一般,感觉这里可以联系gmp),三色标记法,如何通知goroutine让其关闭,map的底层结构2.&nbsp;mysql基本八股,几种并发问题,对应怎么解决的,索引的结构,你是怎么建立索引的等等(记不太清了)3.&nbsp;mysql执行一条语句的时候突然变得很慢,如何去优化,列举一下可能的原因4.&nbsp;gin框架为什么快5.&nbsp;redis的基本八股,几种数据结构,zset底层6.&nbsp;问简历上一些项目相关的技术以及具体实现7.&nbsp;手撕插入区间,思路没问题,但是边界没处理后越界了二面当天就约了二面,我给推到下周一了。二面问的也不是特别难,可以说是八股进阶吧。1.&nbsp;go八股必不可少2.&nbsp;聊项目,具体怎么实现的,有什么难题,怎么解决的3.&nbsp;redis的集群方案,描述几种方式的架构,再说一些优缺点4.&nbsp;手撕合并两个有序链表(怎么才easy,我准备算法的时间最长了)5.&nbsp;聊了聊实习岗位的业务以及相关技术栈6.&nbsp;面试官当场说oc了,几分钟后hr电话来了魔门塔(‌Momenta)‌不是外企也不是国企,‌而是一家民营科技企业‌。‌以下是关于魔门塔的详细背景信息:‌‌性质‌:‌民营科技企业、‌独角兽企业、‌高新技术企业。‌‌成立时间‌:‌2016年12月(‌北京公司)‌,‌2018年6月(‌苏州公司)‌。‌‌注册资本‌:‌北京公司注册资本为88997.215万人民币,‌苏州公司为84905.7108万美元。‌‌经营范围‌:‌包括科技领域内的技术开发、‌技术推广、‌技术转让、‌技术咨询、‌技术服务等,‌涉及自动驾驶、‌人工智能、‌汽车智能化等领域。‌‌投资与合作‌:‌曾获得多轮融资,‌包括通用汽车的投资,‌用于加速自动驾驶技术的研发和应用。‌总结!实力雄厚!!!!!自动驾驶独角兽Momenta2025届校园招聘开启【公司介绍】Momenta是全球领先的自动驾驶公司,致力于通过突破性的AI科技,创造更美好的生活。【岗位需求】算法、后端开发、前端开发、嵌入式开发、架构集成、中间件开发、系统研发【薪酬待遇】行业独角兽有竞争力的薪资+免费三餐、弹性工作不打卡、米哈游、福利奖金、六险一金、带薪假期、社团活动、定期体检、免费健身房、更多福利等你解锁!【工作地点】苏州、北京、上海、深圳【内推链接】https://www.nowcoder.com/creation/whttps://momenta.jobs.feishu.cn/s/irAa1chE内推码:YRHKRW8(后续有流程/面试时间上的问题,欢迎随时联系)&nbsp;投递的uu留下姓名缩写和岗位~我会一一跟进~
Momenta
|
校招
|
24个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务