文章

9

粉丝

289

获赞

4

访问

82.3k

头像
1086-采药,动态规划,注释详细(c语言)
P1086 北京大学机试题
发布于2021年3月17日 20:57
阅读数 9.7k

推荐学习视频:背包问题 https://www.bilibili.com/video/BV1K4411X766

本题实际上就是0-1背包问题。

#include <stdio.h>
#include <stdlib.h>
//定义药的数据结构
typedef struct drug
{
    int time;   //采药所需时间
    int cost;   //药的价值
}drug;
//求两个数的较大值
int max(int a, int b)
{
    return a>b?a:b;
}
//定义药的数组
drug drugs[101];
//定义价值数组,可以看成一个表格,纵表示第i种药,横表示共有的采药时间j
short value[101][1001];

int main()
{
    //输入
    int t, m;//t代表总共能够用来采药的时间,m代表山洞里的草药的数目
    scanf("%d %d", &t, &m);
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d", &drugs[i].time, &drugs[i].cost);
    }
    //构建动态规划的二维数组
    for(int i=1; i<=m; i++)
    {
        for(int j = 0; j <= t; j++)
        {
            if(j < drugs[i].time)//当总的采药时间比采i药所需时间小,则该药采不了,所以时间不变
                value[i][j] = value[i-1][j];
            else//当总的采药时间比采i药所需时间大,则该药足够时间采,比较采该药后的价值与不采该药的价值大小
                value[i][j] = max(value[i-1][j], value[i-1][j-drugs[i].time] + drugs[i].cost);
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发