您的位置:首页 > 其它

背包问题中的01背包和完全背包

2016-04-13 17:04 260 查看

背包问题(Knapsack problem)

简介:给定N种物品,每件物品有各自的重量Wi,价值Vi,现有一个背包,总容量W,要算出在不超出Wm的情况下,达到最大总价值Vm时各种物品的组合情况。
01背包:每种物品只有一件。
完全背包:每种物品有多件,可以反复使用。

基本思路
用每件物品的价值Vi 除以其重量Wi,得到该物品的单位价值,从单位价值高的物品开始选取,若加上第i件物品后重量不超过Wm,则选取该物品,否则判断下一个物品。在重量达到最大或者物品用完后,输出所选择的物品。

代码实现

01背包

#include
#include
#include
int main()
{
int n;
double mm,*m,*v,vv=0,k=0;               //物品件数 n,容量 mm,总价值 vv,物品重量 m[i],物品价值 v[i]
scanf("%lf",&mm);
scanf("%d",&n);
m=(double *)malloc(n*sizeof(double));
v=(double *)malloc(n*sizeof(double));
int i,j,*pb,y;                          //pb用来记录该物品编号
double t,*pa;                           //pa用来记录该物品的单位价值
pa=(double *)malloc(n*sizeof(double));
pb=(int *)malloc(n*sizeof(int));
for(i=0;i


完全背包
  完全背包中显示出每种物品用了多少件

#include
#include
#include
int main()
{
int n;
double mm,*m,*v,vv=0,k=0;
scanf("%lf",&mm);
scanf("%d",&n);
m=(double *)malloc(n*sizeof(double));
v=(double *)malloc(n*sizeof(double));
int i,j,*pb,y;
double t,*pa;
pa=(double *)malloc(n*sizeof(double));
pb=(int *)malloc(n*sizeof(int));
for(i=0;i
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: