初次接触贪心算法,于是找了hdu 1009 FatMouse' Trade这一道水题。
开始交了两次,都得了WA,仔细看了看才知道是忽略了保留三位小数这一要求。改了之后就成功AC了。
代码:
#include <iostream> using namespace std; struct Room{ double value; double punds; double catfood; }; int main() { double M, N; Room room[1000] = { 0 }; double J[1000] = { 0 }; double F[1000] = { 0 }; double sum = 0; int i = 0; while (cin >> M >> N){ sum = 0; if (M == -1 && N == -1) break; for (i = 0; i < N; i++){ cin >> J[i] >> F[i]; room[i].value = F[i] / J[i]; room[i].punds = J[i]; room[i].catfood = F[i]; } double t; int j; for (i = N-1; i > 0; i--) for (j = i-1; j >= 0; j--) if (room[i].value < room[j].value){ t = room[j].value; room[j].value = room[i].value; room[i].value = t; t = room[j].punds; room[j].punds = room[i].punds; room[i].punds = t; t = room[j].catfood; room[j].catfood = room[i].catfood; room[i].catfood = t; } /* Room t; for (i = 0; i < N; i++) for (int j = i + 1; j < N; j++) //奇怪,若将此处的j<N换成i<N,会使得N为0 if(room[i].value > room[j].value ){ t.catfood = room[i].catfood; t.punds = room[i].punds; t.value = room[i].value; room[i].catfood = room[j].catfood; room[i].punds = room[j].punds; room[i].value = room[j].value; room[j].catfood = t.catfood; room[j].punds = t.punds; room[j].value = t.value; } */ i = 0; while (i<N && M){ if (M > room[i].catfood){ M = M - room[i].catfood; sum = sum + room[i].punds; } else{ sum = sum + M / room[i].value; M = 0; } i++; } cout.precision(3); cout.setf(ios::fixed);//控制使出数据为三位小数。 cout<<sum << endl; } //system("pause"); return 0; }个人总结:贪心算法的核心是以局部最优为基础,以求达到全局最优。或者说,达到了全局最优,就极大的满足局部最优。
记忆:控制小数的位数
cout.precision(n); cout.setf(ios::fixed);