POJ 2976 01分数规划基础题目
生活随笔
收集整理的這篇文章主要介紹了
POJ 2976 01分数规划基础题目
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一組"數",一共n個,每個數有兩個權值,價錢a[i],代價b[i],讓你選擇n - k使得 sigma(a[i]) / sigma(b[i]) * 100 最大;
思路:
? ? ? 給你一組"數",一共n個,每個數有兩個權值,價錢a[i],代價b[i],讓你選擇n - k使得 sigma(a[i]) / sigma(b[i]) * 100 最大;
思路:
? ? ? 毫無疑問這個是01分數規劃的最進本形式,唯一的限制就是取個數,那么我們直接sort以下,取出來就行了。沒啥解釋的,這個是自己的第一個01分數規劃,一會要自己總結下01分數規劃的理解了,感覺不是很難,就是證明點東西。
自己總結的01分數規劃:
http://blog.csdn.net/u013761036/article/details/26666261
#include<stdio.h> #include<algorithm>#define N 1000 + 10 #define INF 1000000000 #define eps 0.000001using namespace std;bool camp(double a ,double b) {return a > b; }double a[N] ,b[N] ,d[N];bool ok(double L ,int n ,int k) {double sum = 0;for(int i = 1 ;i <= n ;i ++)d[i] = a[i] - L * b[i];sort(d + 1 ,d + n + 1 ,camp);for(int i = 1 ;i <= n - k ;i ++)sum += d[i];return sum >= 0; }int main () {int n ,k ,i;while(~scanf("%d %d" ,&n ,&k) && n + k){for(i = 1 ;i <= n ;i ++)scanf("%lf" ,&a[i]);for(i = 1 ;i <= n ;i ++)scanf("%lf" ,&b[i]);double low ,up ,mid ,ans = 0;low = 0 ,up = INF;while(up - low >= eps){mid = (low + up) / 2;if(ok(mid ,n ,k))ans = low = mid;elseup = mid;}ans *= 100;printf("%.0lf\n" ,ans);}return 0; }
總結
以上是生活随笔為你收集整理的POJ 2976 01分数规划基础题目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 2728 最优比率生成树
- 下一篇: POJ 3621 最优比率生成环