背包问题(最大装载价值)

mac2024-10-22  66

问题:给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 wi ,价值vi (1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。

#include <iostream> #include<vector> #include<algorithm> using namespace std; struct bag{ int w; //物品的重量 int v; //物品的价值 double c; //单位重量的价值,v/w }a[1001]; bool cmp(bag a, bag b){ return a.c >= b.c; } double knapsack(int n, bag a[], double c){ double cleft=c; int i=0; double b=0; while(i<n && a[i].w<cleft){ cleft -= a[i].w; b += a[i].v; i++; } //装满背包的剩余空间 if (i<n) b += 1.0*a[i].v*cleft/a[i].w; return b; } int main() { int i; for(i=0;i<7;i++){ cin>>a[i].w>>a[i].v; a[i].c=a[i].v/a[i].w; } sort(a,a+i,cmp); cout<<"最大价值为:"<<knapsack(7,a,20); return 0; }
最新回复(0)