voidoutput(int i,int j,int k)//输出方案 { int ans[25], cnt = 0, P = 0, D = 0; while(j) { if(f[i][j][k] == f[i - 1][j][k]) i--; else { ans[++cnt] = i; k -= (p[i] - d[i]); P += p[i]; D += d[i]; j--, i--; } } printf("Jury #%d\n", ++tot); printf("Best jury has value %d for prosecution and value %d for defence:\n", P, D); for (int u = cnt; u >= 1;u--) printf(" %d", ans[u]); printf("\n\n");//注意要多输出一个换行 }
intmain() { int n, m; while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))//读入多组数据 { for (int i = 1; i <= n;i++) scanf("%d%d", &p[i], &d[i]); memset(f, -0x3f, sizeof(f)); f[0][0][400] = 0; for (int i = 1; i <= n;i++) { for (int j = 0; j <= m;j++) { for (int k = 0; k <= 800; k++) { f[i][j][k] = f[i - 1][j][k]; if(j < 1)//因为可以一个人都不选,所以j从0开始,所以要判断j是否等于0 continue; int t = k - p[i] + d[i]; if(t < 0 || t > 800)//判断是否越界 continue; f[i][j][k] = max(f[i - 1][j - 1][t] + p[i] + d[i], f[i][j][k]); } } } for (int i = 0; i <= 400; i++)//找出差值最小的方案 { if(f[n][m][400-i] >= 0 ||f[n][m][i+400] >= 0) { if(f[n][m][400-i] > f[n][m][400+i]) { output(n, m, 400 - i); break; } else { output(n, m, 400 + i); break; } } } } return0; }