当前队伍数量: applyNum
当前专家数量: expertNum
每位专家最多评审队伍数量: expertMax
每个队伍所需专家数量: teamExpertMax
问:每队可分配到专家几人,每个专家可评审队伍数量几个?
只要有一个变量变了,那么其它变量的可用值范围也变了,所以对应的公式应该是什么样的
你有没有想过,其实你的这个问题本身就不应该用动态规划,本身就不存在什么转移方程。
解决这个问题,贪心法是适当且可用的方法。
在此用c#写一个例子,虽然不是java,但是我写了很详细的注释来阐明这个思路。希望有帮助。
namespace ConsoleApp3
{
internal class Program
{
static void Main(string[] args)
{
int[] num1 = { 3, 2, 6, 4, 1, 5, 3, 2, 2, 4 };//每个队伍所需的专家数,数组长度对应队伍数
int[] num2= { 3, 2, 6, 4, 1, 5 };//每个专家能够接待的队伍数,数组长度对应专家数
int[] num11 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };//用于存储每个队伍被选中的情况,1代表被评审,该列表显然长度等于num11
int[] num22 = { 0,0,0,0,0,0 };//用于存储每个专家已接待的队伍数,显然该列表长度等于num2
int count = 0; //最大评审队伍数量
//因为目标是要能评审的队伍数最多,显然我们应该优先选择占用专家数最小的队伍
while (true)//在循环内进行计算解题
{
int min = 999999999;//用于存储所需专家数最小的队伍所需的专家,在此初值赋一个特别大的数(只要大于所需专家的最大数就行)
int tmp=0;//尚未被接待的队伍中所需专家数最少的队伍的索引
for (int i = 0; i < num1.Length; i++)//遍历各个队伍
{
if (num11[i]==0)//如果该队伍尚未被接待
{
if (min>num1[i])
{
min = num1[i];//更新尚未被接待队伍所需的最小专家数
tmp = i;
}
}
}
num11[tmp] = 1;//更新被选中的队伍状态
int tmp2 = 0;//专家可以接待的最大队伍数
for (int i = 0; i < num2.Length; i++)//遍历专家
{
if (num22[i]<num2[i])//表明该专家尚未接待满
{
tmp2++;
}
}
if (tmp2 < num1[tmp])//如果当前可接待的专家数小于所需专家最小的队伍的数量
{
break;//说明以达到最大的接待能力,计算跳出
}
else//如果没有超出接待能力,则选择出专家
{
int[] tmp3 = { 0, 0, 0, 0, 0, 0 };//用于存储在这一轮选择中,每个专家的选择情况,该数组长度等于num2
int tmp5 = num1[tmp];//存储当前选择的队伍需要的专家数
while (true)//在循环内选择专家
{
int max = 0;//存储剩余接待能力最大的专家的剩余接待数
int tmp4 = 0;//存储专家索引
for (int i = 0; i < num2.Length; i++)
{
if (tmp3[i]==0 && max<num2[i]-num22[i])//如果该专家此轮尚未被选择且剩余接待能力大于max,更新max
{
max = num2[i] - num22[i];
tmp4 = i;
}
}
tmp3[tmp4] = 1;//选择该专家
num22[tmp4]++;//该专家目前已服务的队伍数+1
tmp5--;//队伍所需专家数减一
if (tmp5==0)//专家已分配完
{
break;//跳出循环
}
}
}
int tmp6 = 0;//存储已选择的队伍数
for (int i = 0; i < num1.Length; i++)
{
if (num11[i]==1)
{
tmp6++;
}
}
if (tmp6==num1.Length)//如果所有队伍已选择
{
break;//跳出
}
}
for (int i = 0; i < num1.Length; i++)
{
if (num11[i] == 1)
{
count++;
}
}
Console.WriteLine(count);//打印最大队伍数量
Console.ReadKey();
}
}
}
1、前提:如果每个队伍是公平的需要的专家数量是一样的,每个专家能力也是一样的可以评选的队伍是一样的:
我的理解需要队伍数量每个队伍需要的专家数量必须小于等于专家数量每个专家可以评审的数量。
满足公式:applyNum*teamExpertMax≤expertNum*expertMax
2、前提:每个队伍需要的专家数量是不一样的,每个专家评审的队伍的数量也是不一样的
则需要把teamExpertMax、expertMax变量定义为一元数组:
满足公式:∑applyNum*teamExpertMax[applyNum]≤∑expertNum*expertMax[expertNum]
原题在哪里啊
这是算法与开发语言无关吧
给一个输入和输出,用来测试验证
全部枚举而后使用numpy 比大小
参考陕西人民出版社,陈军斌,赵来军著的《最优化理论与方法》,第7章第五节213页的动态规划模型举例,
假设每队可分配到专家m人,每个专家可评审队伍数量n个,可以得到这样的不等式:
0 < applyNum * m <= experNum
0 < m <= teamexpertMax
0 < expertNum * n <= applyNum
0 < n <= experMax
其中m, n都是正整数,这种不等式的解应该不多。
题主的意思应该是一个队伍可以由多个专家评审,一个专家可以评审多个队伍,属于多对多,这里只能单从单对多列两个公式,希望对题主有帮助
“每位专家最多评审队伍数量”:专家数×每位专家最多评审队伍数>=队伍数(否则队伍多了评审不过来)
“每个队伍所需专家数量”:队伍数×每个队伍所需专家数量<=专家数(否则专家人数不够)
猜测应该满足如下公示
expertNum = applyNum * teamExpertMax
每位专家最多评审队伍数量
0 < expertMax <=applyNum
如果 按照上面描述的那种 teamExpertMax 是每个队伍所需要的数据, 那么 专家总数 expertNum = applyNum * teamExpertMax
设:
当前队伍数量: m
当前专家数量: n
每位专家最多评审队伍数量: a (可见这里的y<=a)
每个队伍所需专家数量: b (可见这里的x>=b)---这里应该是至少需要b个专家
为了使分配合理化,假设每队需要分配x个专家,每个专家可评判队伍数为y。目的是能够将这个专家分配给每只队伍,且达到最好的效果.则:
m*x<=n
m/y<=n
结合:
fmin m*x+m/y<=2n
st. x>=b
y<=a
应该是上述这样的!
applyNum*teamExperMax=expertNum!/(expertNum-expertMax)!
队伍数a专家数b,expertmax=c,另一个是d.
如果a,b求c,d的话就这样a/b≤c,b/a≥d然后解方程。但注意:该方程有很多解,解的数量呈a+b的线性增长(大概)
cpdis und
Education ins 19
Stand kind of ras
Off scand 28ins
Ssktu isospso sin in
1.