Description:
部分背包问题是这样一个问题:
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,
使得装入背包中物品的总价值最大?
选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
例如:背包容量为5,有3个物品
第一个物品重量是2 价值是3
第二个物品重量是3 价值是4
第三个物品重量是4 价值是8
那么选择第三个物品整体和第一个物品的1/2,得到最大总价值9.500
Input:
多组数据,
第一行为背包容量W(1<=w<=2000000)和物品数量N(1<N<=200)
接下来N行每行两个整数分别代表第i个物品的重量wi(wi<=50000)和价值vi(vi<=1000)
#include<cstdio> #include<algorithm> using namespace std; struct Thing{ double weight,price;//物品的总重量和单位价格 bool operator<(const Thing &b) const{ return price>b.price; } }th[205]; int main(){ int n; double w; while(~scanf("%lf%d",&w,&n)){ for(int i=0;i<n;i++){ double value; scanf("%lf%lf",&th[i].weight,&value); th[i].price=value/th[i].weight; } sort(th,th+n); double ans=0; int cur=0;//表示现在在考虑第几件物品 while(w>0&&cur!=n){ double t=min(w,th[cur].weight); //现在背包的大小,第cur件物品剩下的重量 ans+=t*th[cur++].price;//增加这么多价值,cur到下一件物品 w-=t;//背包又少了这么多体积 } printf("%.3lf ",ans); } return 0; }