用貪心演算法求最優解
阿新 • • 發佈:2018-11-14
題目:有 m 元錢,n 種物品;每種物品有 j 磅,總價值 f 元,可以
使用 0 到 f 的任意價格購買相應磅的物品,例如使用 0.3f 元,可以購買 0.3j 磅物
品。要求輸出用 m 元錢最多能買到多少磅物品
使用 0 到 f 的任意價格購買相應磅的物品,例如使用 0.3f 元,可以購買 0.3j 磅物
品。要求輸出用 m 元錢最多能買到多少磅物品
演算法思想:,每次都買價效比最高的產品,價效比的計算公式為(重量\價格),價效比的含義為用最少的錢買到最多的東西
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; struct goods{ double Weight; double Value; double xingjiabi; //價效比,重量/價值 bool operator <(const goods &A) const{ return xingjiabi > A.xingjiabi; } }buf[1000]; int main() { double m; //m元錢 int n; //n種物品 cout<<"輸入m元錢,n種物品"<<endl; while(cin>>m>>n){ //cout<<m<<endl<<n<<endl; if(m == -1 && n== -1) break; for(int i=0; i<n; i++){ cin>>buf[i].Weight>>buf[i].Value; //輸入i種物體的重量和價值 buf[i].xingjiabi = buf[i].Weight / buf[i].Value; //計算價效比 } sort(buf,buf+n); //按價效比降序排列 int idx = 0; //當前貨物下表 double sumWeight = 0; //累加所能得到的總重量 while(m>0 && idx < n){ //迴圈條件為,既有物品剩餘(idx < n)還有錢剩餘(m > 0)時繼續迴圈 if(m > buf[idx].Value ){ sumWeight += buf[idx].Weight; //若能買下該種物品的全部物品 m -= buf[idx].Value; }else{ sumWeight += buf[idx].Weight * m / buf[idx].Value; //按價效比買東西 m = 0; //錢全部花完 }//若能買下該種物品的部分物品 idx++; //繼續下一個物品 } cout<<"所得到的總重量:"<<sumWeight<<endl; } return 0; }