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;

}

全部评论

相关推荐

合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11036次浏览 94人参与
# 你的实习产出是真实的还是包装的? #
1956次浏览 42人参与
# 巨人网络春招 #
11365次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7640次浏览 43人参与
# 简历第一个项目做什么 #
31744次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433544次浏览 3926人参与
# 米连集团26产品管培生项目 #
6033次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187205次浏览 1122人参与
# 牛客AI文生图 #
21446次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152446次浏览 888人参与
# 研究所笔面经互助 #
118964次浏览 577人参与
# 简历中的项目经历要怎么写? #
310361次浏览 4219人参与
# AI时代,哪些岗位最容易被淘汰 #
63815次浏览 828人参与
# 面试紧张时你会有什么表现? #
30510次浏览 188人参与
# 你今年的平均薪资是多少? #
213134次浏览 1039人参与
# 你怎么看待AI面试 #
180131次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64331次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76539次浏览 374人参与
# 我的求职精神状态 #
448131次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363512次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160674次浏览 1112人参与
# 校招笔试 #
471179次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务