Algorithm 动态规划递推关系

Algorithm 动态规划递推关系,algorithm,dynamic-programming,recurrence,Algorithm,Dynamic Programming,Recurrence,我试图找到和解决一个动态规划方法的递归关系。作为免责声明,这是家庭作业的一部分,我基本上已经完成了,但对分析感到困惑 这是我的(工作)代码: int-shop(int-m,int-c,int-items[][21],int-sol[][20]){ 如果(m

我试图找到和解决一个动态规划方法的递归关系。作为免责声明,这是家庭作业的一部分,我基本上已经完成了,但对分析感到困惑

这是我的(工作)代码:

int-shop(int-m,int-c,int-items[][21],int-sol[][20]){
如果(m<0)返回NONE;//没有剩余的钱
如果(c==0)返回0;//没有剩下衣服
如果(sol[m][c]!=NONE)返回sol[m][c];//我们以前来过这里
//对于当前服装的每个模型

对于(int i=1;i,您可以将每个DP状态
(m,c)
看作一个图的顶点,其中对状态
(m-item\u i,c-1)
的递归调用是从
(m,c)
(m-item\u i,i)
的边


对递归的记忆意味着只从一个顶点开始搜索一次,也只处理它的输出边一次。因此,你的算法本质上是这个图上的线性搜索,具有复杂性
O(|V |+| E |)
。有M*C个顶点,最多
max(K)
每一条边都有一条边,因此您可以通过
O(M*C*max(K))
来限制边的数量

一个典型的时间为O(n^3)…的动态规划。将循环分解为一个循环,您将开始看到针对精心提问的家庭作业问题的+1解决方案
int shop(int m, int c, int items[][21], int sol[][20]) {
    if (m < 0) return NONE;                  // No money left
    if (c == 0) return 0;                    // No garments left
    if (sol[m][c] != NONE) return sol[m][c]; // We've been here before

    // For each model of the current garment
    for (int i = 1; i <= items[c-1][0]; i++) {
        // Save the result
        int result = shop(m-items[c-1][i], c-1, items, sol);

        // If there was a valid result, record it for next time
        if (result != NONE) sol[m][c] = max(sol[m][c], result+items[c-1][i]);
    }

    return sol[m][c];
}