01背包问题--C语言代码

01背包问题的解释可以看百度百科:01背包问题

自己不太懂,不过看这个代码好像有点理解的意思了,就先收藏一下代码吧

 

/********************************************************/
/*背包问题:有m件物品和一个承重为t的背包。              */
/*          第i件物品的重量是w[i],价值是v[i]。         */
/*          求解将哪些物品装入背包可使这些物品的        */
/*          重量总和不超过背包承重量t,且价值总和最大。 */
/********************************************************/

/* 变量对应,这样有意义一些,看起来很舒服
m --- count
t --- max_weight
w[i] --- weight[i]
v[i] --- value[i]
*/

#include <stdio.h>
#include <string.h>


int total_value[1010]; // 记录不同承重量背包的总价值
int weight[1010]; // 记录不同物品的重量
int value[1010]; // 记录不同物品的价值


//返回x,y的最大值
int max(int x, int y)
{
    if(x > y)
        return x;
    return y;
}


int main()
{
    int max_weight; // 背包的最大承重量
    int actual_weight; // 背包实际承重
    int count; // 物品的数量
    int i, j; // 临时变量

    memset(total_value, 0, sizeof(total_value));  //总价值初始化为0
    printf("请输入背包承重量 物品的数量:\n");
    scanf("%d %d", &max_weight, &count);  //输入背包最大承重量max_weight、物品的数目count
    printf("请输入每件物品的重量 价值:\n");
    for(i = 1; i <= count; i++)
        scanf("%d %d", &weight[i], &value[i]);  //输入count组物品的重量weight[i]和价值value[i]

    //尝试放置每一个物品
    //在放入第i个物品前后,检验不同j承重量时,背包的总价值
    //如果放入第i个物品后比放入前的价值提高了,则修改j承重量背包的价值,否则不变
    for(i = 1; i <= count; i++)
        for(j = max_weight; j >= weight[i]; j--)
            total_value[j] = max(total_value[j-weight[i]]+value[i], total_value[j]);

    // 获取背包的实际承重
    for(actual_weight = max_weight; actual_weight > 0; actual_weight--)
        if(total_value[actual_weight] != total_value[actual_weight-1])
            break;

    printf("装入背包的物品\"重量:价值\" :\n");
    j = actual_weight;  // 临时记录背包重量
    for(i = 1; i <= count; i++)
    {
        // 如果物品被放入,一定符合这样的条件
        if(total_value[j] == total_value[j-weight[i]] + value[i])
        {
            printf("%d:%d\n", weight[i], value[i]);
            j-=weight[i];
        }
    }

    printf("背包最终重量 价值\n");
    printf("%d %d\n", actual_weight, total_value[actual_weight]);
    getchar();
    return 0;
}

以下为两组测试数据:

请输入背包承重量 物品的数量:
10 3
请输入每件物品的重量 价值:
1 2
8 3
5 6
装入背包的物品”重量:价值” :
1:2
5:6
背包最终重量 价值
6 8

请输入背包承重量 物品的数量:
20 5
请输入每件物品的重量 价值:
5 10
25 40
12 8
10 10
15 2
装入背包的物品”重量:价值” :
5:10
10:10
背包最终重量 价值
15 20

非常不好意思,当初记录的时候没有测试,理解也不深,现在应该可以正常运行了

 

 

    原文作者:分支限界法
    原文地址: https://blog.csdn.net/xuqi7/article/details/72477996
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞