| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2477 人关注过本帖
标题: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册: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
快速回复:01背包怎么知道拿了哪个物品
数据加载中...
 
   



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

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