我正在开展一个项目,我必须通过动态编程找到最低成本。我们填充了一个数组A[n*m]
。我们还有另一个数组b[n*m]
。我们必须填充另一个c(n*m)
数组c(i,j)
填充最少的
for (i=1 to m)
a[i,j]+B[j,k]+c[i-1,k]
例如我们有this arrays。
这是我的代码:
for (int t = 1; t < n; t++) {
for (int y = 0; y < m; y++) {
int min = 9999555;
for (int k = 0; k < m; k++) {
if ((a[t][y] + b[y][k]) < min) {
min= a[t][y] + b[y][k] + c[t - 1][k];
}
}c[t][y] += min;
}
}
for (int u = 0; u < n; u++) {
for (int z = 0; z < m; z++) {
System.out.print(c[u][z]+" ");
}
System.out.println();
}
c
的第一列应与a
的第一列相同。
例如:
c[2,1]
为min{A[2,1]+c[1,1]+b[1,1], A[2,1]+C[1,2]+B[2,1],A[2,1]+c[1,3]+b[3,1]}
我想问你我的代码是否是正确的动态编程方法。
答案 0 :(得分:0)
让我们清楚地陈述事情:
A [i,j]是在VM j上运行进程i的成本
State C [i,j]意味着在VM“0..j”上运行进程“0..i”的最低成本
我们现在假设没有B成本数组。
目标是状态C [n,m],这是在VM“0..m”上运行进程“0..n”的最低成本。
我们可以从:
状态C [i-1,j]表示VM“0..j”将运行附加进程“i”并考虑在VM上运行进程“i”的成本“0 .. j“那是和(a [i,k]),其中k = 0..j
因此成本是C [i-1,j] + sum(a [i,k])其中k = 0..j
状态C [i,j-1]表示进程“0..j”将在另一个VM“j”上运行(所以总计为“0..j”)并考虑到在VM“j”上运行进程“0..i”的成本,即总和(a [k,j]),其中k = 0..i
因此成本是C [i,j-1] + sum(a [k,j])其中k = 0..i
通过取这两个值中的最小值,我们找到C [i,j]
你到目前为止同意吗?
更新。
假设进程和VM编号从0开始:
基本情况:
for(int j=0; j < m; j++)
c[ 0 ][ j ] = a[ 0 ][ j ];
DP循环:
for (int i = 1; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int min = Integer.MAX_INT;
for (int k = 0; k < m; k++)
{
if ((a[ i ][ j ] + b[ k ][ j ] + c[ i-1 ][ k ]) < min)
min= a[ i ][ j ] + b[ k ][ j ] + c[ i-1 ][ k ];
}//try every VM
c[ i ][ j ] = min;
}//for every VM
}//for every process
答案 1 :(得分:0)
对云计算的访问与动态程序员合作公司正在提供像亚马逊这样的计算云计算,他们都是关于虚拟人(虚拟机,虚拟机),而这些虚拟人又将其交给其他人在整个使用时间内获得适当的报酬。在这个过程中有许多草图,每个草图都有不同,例如,一个虚拟机A可能优于另一个虚拟机成本B来执行该过程使用更多的CPU,而B在运行的过程中优于A dsc。可能还有一个更昂贵的C系统在性能上优于A和B(但它更昂贵)。虚拟机设计的预测是许多财务资源。这个问题针对具体工作。我们有一个深度的过程,包括链形式的N个实验:Δ1→Δ2→Δ3→.....→ΔN。结果表明,Δ1的结果作为输入传递给Δ2,Δ2的结果传递给Δ3,依此类推。我们还有M个虚拟图案设施。作为一个条目,我们还有2个表。该人是NXM并导致总成本在一种类型的虚拟机中运行事务。贵宾表是MXM,它支付将数据发送给另一个的成本。示例输入如下:在特定示例中,嵌入式进程有4个方案,并且有3个VM模式可用。第一个执行4个例程,成本分别为5,7,7和2。它还与其他两类技术人员进行通信,成本为7和2.要实现的动态编程算法:要填充的算法成本NXM,其中每个成本单元(i,j)显示最低的总成本这个过程直到我住在j j。为了在移动中执行生命,要么发现i-1的结果可以转移到其他社区或从其他社区转移,同时考虑到通信成本。在上面的示例中,此表具有等效性,实际上这意味着较低的消耗是15,并且在最后一个操作是虚拟机时实现: