#include <iostream> #include <algorithm> #include <fstream> using namespace std; int p[300], d[300]; int s[300];//s[i] = p[i] - d[i]; int f[30][840]; int path[30][840]; int c[30]; //choose jury bool isvalid(int j, int k, int i) //line j, insert i, sum pi+di=k { for (int q=j; q >= 1; q--) //i never been used { if (path[q][k] == i) return false; else k -= s[path[q][k]]; } return true; } int com(const void* a, const void* b) { return *(int*)a - *(int*)b; } ifstream in("in.txt"); #define cin in int main() { int n, m, i, j, k, count, zero, pp, dp, start, temp; count = 0; while (true) { cin >> n >> m; if (n==0 || m==0) { break; } for (i=1; i <= n; i++) { cin >> p[i] >> d[i]; s[i] = p[i] - d[i]; } memset(f, -1, sizeof(f)); memset(path, 0, sizeof(path)); zero = m * 20; f[0][zero] = 0; for (j=0; j < m; j++) // the number of jury members 0->m-1 { for (k=0; k <= zero*2; k++) // k is all possible sum of p[i] + d[i]; { if (f[j][k] >= 0) { for (i=1; i <= n; i++) //the number of candidates 1->n { temp = f[j][k] + p[i] + d[i]; if (f[j+1][k+s[i]] < temp && isvalid(j, k, i)) { path[j+1][k+s[i]] = i; //line j => line j+1 f[j+1][k+s[i]] = temp; } } } } } for (k=0; k <= zero; k++) { if (f[m][zero-k]!=-1 || f[m][zero+k]!=-1) // choose minimal abs(zero-k) { start = f[m][zero-k] > f[m][zero+k] ? zero-k : zero+k;// if have zero-k and zero+k, choose the one which have larger sum break; } } cout << "Jury #" << ++count << endl; pp = (f[m][start]+(start-zero))/2; //pp-dp = start-zero dp = (f[m][start]-(start-zero))/2; //pp+dp = f[m][start] cout << "Best jury has value " << pp <<" for prosecution and value " << dp << " for defence:" << endl; for(j=m; j >= 1; j--) { c[j-1] = path[j][start]; start -= s[c[j-1]]; } qsort(c, m, sizeof(int), com); for (j=0; j < m; j++) cout << " " << c[j]; cout << endl << endl; } return 0; }
转载于:https://www.cnblogs.com/agpro/archive/2010/06/29/1767346.html