背包价值最大问题

实验题目

给定n种物品和一个背包.物品i的重量是Wi,其价值为Vi,背包的容量为C.在选择物品i装入背包时,可以选择物品i的一部分,1<= i <=n.问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大

需求分析】

本演示程序用VS编写。

1、输入的形式和输入值的范围:1<= i <=n.

2、输出的形式: 直接输出结果

程序所能达到的功能: 选择装入背包中的物品,使得装入背包中物品的总价值最大。

测试数据:

物品个数和背包容量分别为:5 10

物品重量分别为:2 2 6 5 4

物品价值分别为:6 3 5 4 6

概要设计

本程序包含3个函数:

1.主函数main()

2.比较函数cmp()

3.qsort()

各函数间关系如下:

                        cmp

main

                        qsort

详细设计

结点类型

typedef struct{

int wi; int vi;

}Goods;

for循环

for (i = n - 1; i >= 0; i--)

{sum += goods[i].wi;

if (sum <= c)

{total += goods[i].vi;

}

else

{sum -= goods[i].wi;

}

 

调试分析

使用说明

程序执行后显示

========================

物品个数和背包容量分别为:

=======================

依次按照提示输入物品个数,背包容量,重量和价值

【测试结果】

 

附录

#include <stdio.h>

#include <stdlib.h>  

#define MAXN 410

typedef struct {

int wi; int vi;

}Goods;

Goods goods[MAXN];      //算法思路:贪心算法,每次都向背包里面装入价值最大的物品,如果装入超过容量c

int cmp(const void *a, const void *b) //比较函数

{return (*(Goods*)a).vi - (*(Goods*)b).vi;

}

int main()

{int n, c, i, sum = 0, total = 0;

printf("物品个数和背包容量分别为:");

scanf("%d %d", &n, &c);

printf("物品重量分别为:");

for (i = 0; i < n; i++)

{scanf("%d", &goods[i].wi);

}

printf("物品价值分别为:");

for (i = 0; i < n; i++)

{scanf("%d", &goods[i].vi);

}

qsort(goods, n, sizeof(Goods), cmp);

/*其中第一个参数是参与排序的数组名,第二个参数是参与排序的元素个数,第三个参数是单个元素的大小,第四个参数比较函数,

qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。

int类型数组从小到大排序

    int num[100];

    int cmp ( const void *a , const void *b )

    {

    return *(int *)a - *(int *)b;

    }

    qsort(num,100,sizeof(num[0]),cmp);*/

    for (i = n - 1; i >= 0; i--)

{sum += goods[i].wi;

if (sum <= c)

{total += goods[i].vi;

}

else

{sum -= goods[i].wi;

}

}

printf("装入背包中物品的总价值最大为:%d\n", total);

return 0;

}

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38855717/article/details/80298088