算法丑陋,时间略长,还望指教。
#include <stdio.h>
#include <memory.h>
/*
第一步,读懂题意,题目的要求是使得选定方案,在辩控差最小的前提下,辩控和最大。
第二步,寻找状态,这道题的状态有两个比较关键的点,一是选了多少人,二是这些人的辩控差,如果我们知道已经选出m人时所有组合
的辩控差,从中选取一个是很容易的。所以我们把每个组合的状态记为(选取人数,辩控差)|——>辩控和,并用一个m*m*20*2的数组对状态
进行记录,而且还要考虑到一个状态可能没有对应的人数,而且还要记录具体是选取了那些人,所以我们规定不存在的状态对应辩控和为
-1,再用一个m*m*20*2的数组记录具体的人选。
第三步,状态转移,每次要再选一个人进来,怎么知道这个人到底能不能选呢?如果加入这个人之后,使我们对应状态的辩控和更大,那么
我们认为这是一个更优解。
这里如何避免重复选择也是一个问题,如果直接记录是非常不方便的,所以我们可以记录选择的过程,逆推选择了那些人
*/
int state[21][900],choise[21][900],times,answer[20];
int main()
{
int n,m,i,j,k,a;
scanf("%d%d",&n,&m);
while(n)
{
int middleline=m*21;
times++;
memset(state,-1,sizeof(state));
memset(choise,-1,sizeof(choise)

本文通过C语言实现POJ-2979题目的解法,利用动态规划策略解决陪审团人选问题。虽然算法表达不够优雅,运行时间稍长,欢迎探讨优化方案。
最低0.47元/天 解锁文章
744

被折叠的 条评论
为什么被折叠?



