Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 背包的变化-精确重量的最小总成本_Algorithm_Dynamic Programming_Knapsack Problem - Fatal编程技术网

Algorithm 背包的变化-精确重量的最小总成本

Algorithm 背包的变化-精确重量的最小总成本,algorithm,dynamic-programming,knapsack-problem,Algorithm,Dynamic Programming,Knapsack Problem,项目有多种类型(N种类型),每种类型都有重量wi和成本ci。每一个都有无限多个。问题是制作一个重量精确且物品总成本最小的背包。我知道我应该在这种情况下使用动态,但这不是一个常见的背包问题,我找不到关系。我也发现了一些类似的问题,但我还不了解这些解决方案。这里是链接。 如何使用DP来解决它?让f[i]表示,为了得到重量i,最小成本。g[i]表示是否可能精确组合重量i f[0]=0;g[0]=true; for (int i=0;i<N;i++) for (int j=0;j<W

项目有多种类型(N种类型),每种类型都有重量wi和成本ci。每一个都有无限多个。问题是制作一个重量精确且物品总成本最小的背包。我知道我应该在这种情况下使用动态,但这不是一个常见的背包问题,我找不到关系。我也发现了一些类似的问题,但我还不了解这些解决方案。这里是链接。
如何使用DP来解决它?

让f[i]表示,为了得到重量i,最小成本。g[i]表示是否可能精确组合重量i

f[0]=0;g[0]=true;
for (int i=0;i<N;i++)
    for (int j=0;j<W;j++)
        if (g[j]) {
            g[j+w[i]]=true;
            if (f[j+w[i]]==0||f[j+w[i]]>f[j]+c[i])
                f[j+w[i]]=f[j]+c[i];
        }

if (g[W]) return f[W];
else return 0;//impossible
f[0]=0;g[0]=真;

对于(int i=0;i假设你想找到实现
W
权重所需的最小成本,并且
c_i>0
W_i>0
那么我们可以将
min_成本(i,W)
定义为仅使用
i
N
中权重为
W
的项目即可实现的最小成本

  • 基本情况发生在我们只有一个项目时,因此当
    i=N
    时。在这种情况下,解决方案是:

    min_cost(N,0)=0
    因为如果我们不使用项目
    N
    ,那么我们已经有了等于0的权重

    min_cost(N,W)=c_i*W/W_i
    如果
    W
    W_i
    的倍数,即
    W mod W_i=0

    min_cost(N,W)=无穷大
    否则,因为我们无法仅使用最后一项来实现精确的
    W
    权重

  • 循环关系现在可以表述为:

    min_成本(i,W)=min(c_i*k+min_成本(i+1,W-k*W_i))
    对于
    k=0
    直到
    W-k*W_i<0

循环关系表示,我们将尽可能多地使用项目
i
,而我们没有使权重大于
W

然后,您可以使用递归算法来实现此方法,使用并存储您认为适合的实际解决方案(递归中的
k
s)

编辑根据建议,如果我们注意到有两种情况会影响
min\u成本(i,W)
,则可以实现加速。这种情况首先是当根本不需要使用第i项时,即
min\u成本(i+1,W)
以及当我们将至少使用第i项时,这与
min\u成本相同(i,W-W_i)
因为我们可能会多次使用项目
i
。这将我们的重复次数更改为以下内容:

min_cost(i, 0) = 0         // We already reached our goal
min_cost(i, W) = Infinity  // if (W < 0 or i > N) then we can't get to W

min_cost(i, W) = min(min_cost(i+1, W), min_cost(i, W - w_i) + c_i)
minu成本(i,0)=0//我们已经达到了目标
最小成本(i,W)=无穷大//如果(W<0或i>N),则我们无法到达W
最小成本(i,W)=最小(最小成本(i+1,W),最小成本(i,W-W)和最小成本(c)

这里有一个加速:如果对于给定的i,您以递增的顺序计算权重,那么要计算
最小成本(i,W)
您只需要尝试将项目i的0个实例添加到项目i+1..N的最优解中,或者将项目i的1个实例添加到项目i..N的最优解中(你已经计算过了,因为它的权重较低):
min_cost(i,W)=min(min_cost(i+1,W),min_cost(i,W-W_i)+c_i)
。在所有权重都为1的最坏情况下,这会杀死W的一个因子。我在答案中添加了加速比。加速比很好,而且更简单,谢谢!不客气!如果你写e.g。“@j_random_hacker”在评论中的某个地方,它会通知那个人。我之所以注意到你的评论,是因为我是出于虚荣才回来的:-P@GustavoTorres,你有没有机会看看这个-?谢谢。这个算法真的考虑到了无界性吗?(每种类型都有无限多个可用).我不太明白它是怎么回事?