标题:01背包怎么知道拿了哪个物品
只看楼主
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
已结贴  问题点数:20 回复次数:5 
01背包怎么知道拿了哪个物品
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int main(void)
{
    unsigned max_value(unsigned*, unsigned*, size_t, unsigned);

    unsigned num, capacity, maxvalue;

    printf("输入物品个数:");
    scanf_s("%u", &num, 1);
    printf("输入背包容量:");
    scanf_s("%u", &capacity);
    printf("\n");

    unsigned *value = (unsigned *)malloc(sizeof(unsigned) * num + 1);
    unsigned *weight = (unsigned *)malloc(sizeof(unsigned) * num + 1);

    value[0] = 0;
    weight[0] = 0;
    for (size_t i = 1; i <= num; i++)
    {
        printf("输入第%d个物品需要的容量和价值:", i);
        scanf_s("%u%u", &weight[i], &value[i], 2);
    }

    maxvalue = max_value(value, weight, num, capacity);

    printf("%u\n", maxvalue);

    system("pause");

    return 0;
}

unsigned max_value(unsigned *value, unsigned *need, size_t num, unsigned capacity)
{
    unsigned *x = (unsigned *)malloc(sizeof(unsigned) * (capacity + 1));
    unsigned maxvalue;
    size_t i, j;

    for (j = 0; j <= capacity; j++)
        x[j] = 0;

    for (i = 1; i <= num; i++)
    {
        for (j = capacity; j; j--)
            if (j >= need[i] && value[i] + x[j - need[i]] > x[j])
                x[j] = value[i] + x[j - need[i]];
        for (j = 0; j <= capacity; j++)
            printf("%6u\t", x[j]);
        printf("\n\n");
    }

    maxvalue = x[capacity];

    free(x);

    return maxvalue;
}



[此贴子已经被作者于2019-1-17 11:02编辑过]

搜索更多相关主题的帖子: unsigned value num printf for 
2019-01-17 10:57
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
因为用的是一维数组,好多信息都被覆盖了,虽然不影响计算最大值,但是想知道拿了哪个物品就有点费劲了
2019-01-17 11:01
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:10 
我没细看你的代码  但是有一点可以说一下,就是一维数组 二维数组 都无所谓,可以相互转化

DO IT YOURSELF !
2019-01-17 11:06
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:10 
代码中显示:每一个for循环放置的都是一个物品,因此而这个物品就是need[i],中i的序号,因此i就是背包包含的物品。若要知道放置了什么物品:
可以增加一个与capacity一样容量的数组flag[capacity].也要初始化为0.
     if (j >= need[i] && value[i] + x[j - need[i]] > x[j])
{//新增
            x[j] = value[i] + x[j - need[i]];
            flag[j]=i;//新增
}//新增
        for (j = 0; j <= capacity; j++)
            printf("%6u-%d\t", x[j],flag[j]);//flag[i]就是物品序号
        printf("\n\n");

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2019-01-17 15:48
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 4楼 do8do8do8
我试了下你的方法,看不出来选了哪个
2019-01-19 19:04
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 

在网上看到的文章,貌似不能只用一维数组记载信息
2019-01-20 20:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-492722-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.110108 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved