背包问题(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