【实验题目】
给定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;
}