背包问题有两类,如果每一件物品不能分割,只能作为整体或者装入背包,或者不装入,称为0/1背包问题,如果物品是可以分割的,也就是允许将其中的一部分装入背包,这类问题称为一般背包问题或简称背包问题。
对于一般背包问题,其思想就是贪心,对于每一件物品有权值和重量,将权值与重量的比值按从大到小的顺序排序。然后依次放入背包。也就是信价比高的先放入背包。下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define Max 100
struct backage{
int index;
double weight;
double value;
double account;
}back[Max];
int n;
double u;
bool cmp(const struct backage p,const struct backage q){
return p.value/p.weight>q.value/q.weight;
}
void zero_backage(){
int i;
for(i=0;i<n;i++){
if(back[i].weight>u)
break;
back[i].account=1;
u-=back[i].weight;
}
if(i<n) back[i].account=u/back[i].weight;
}
int main(){
scanf("%d%lf",&n,&u);
int i;
for(i=0;i<n;i++){
scanf("%lf%lf",&back[i].value,&back[i].weight);
back[i].account=0;
back[i].index=i+1;
}
sort(back,back+n,cmp);
zero_backage();
for(i=0;i<n;i++)
printf("%d %lf %lf %lf\n",back[i].index,back[i].value,back[i].weight,back[i].account);
return 0;
}