动态规划和题目总结

https://blog.csdn.net/qq_19446965/article/details/81331187

持续更新

1    动态规划背包问题 https://blog.csdn.net/qq_36303472/article/details/68935954

2    0-1背包:https://www.cnblogs.com/lfeng1205/p/5981198.html

3   动态规划题目https://blog.csdn.net/cc_again/article/details/25866971

4   动态规划-金额为Sum的所有纸(硬)币组合https://blog.csdn.net/f2006116/article/details/52565979

5   程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦https://blog.csdn.net/v_july_v/article/details/6543438

6   背包动态规划         https://blog.csdn.net/qq_40086556/article/details/80098064

7.一些类似于回文和背包的动态规划问题i:https://blog.csdn.net/qq_40086556/article/category/7785139

这些思路大致是一致的,一些变形题加了一些限制条件,那么在使用动态规划的时候,其转移方程某些条件就要受到限制

昨天的题: 

一组没有重复数字的数组,求出能组合出mu'b目标target的种类有多少

设动态方程为DP[i][j]

含义是:在数组arry中前i个数neng能组成目标值target为j的组合有DP[i][j]种

如果说,第i个数

令temp=arry[i],如果temp>j,说明这第i个数比目标值要大,那么我们想组合成目标值为j的方法中就不可能存在有数字arry[i]

这种,那么也就只能从前i-1个数中找到目标值为j的方法数了,所以

if(arry[i]>j) 
    DP[i][j]= DP[i-1][j]        //用前i-1个数字来组合成目标值为j的方法数               
 
但是如果arry[i]<j,那么说明还有另外一些方法来组合成目标值j,其中这些方法的前提是必须存在数字arry[i]                
 那么相应的目标值就变为j-arry[i],所以就转换为在前i-1个数字中,找到目标值为j-arry[i]的方法数有多少种
       
DP[i][j]=DP[i-1][j-arry[i] ]   //if(arry[i]<j)
所以把这两种情况综合起来就是能组成目标值为j的方法数 

vector<vector<int>>DP(arry.size(),vector<int>(target,0));             
for(int i=1 ;i<arry.size() ;i++)
{
    for(int j=1;j<=target;j++)
      {  
             DP[i][j]= DP[i-1][j] ;
              if(arry[i]<j)
                   DP[i][j]+=DP[i-1][j-arry[i] ] 
         }
}

 
当然还得初始化:初始化还有点问题


就是用0个数字来组成目标值为j的方法数 0
for(int i = 1; i < n; i++) DP[0][j] =(arr[0]==j) ? 0 : obstacleGrid[0][i - 1]; 就是用前i个数右孩子)
dp[i][0]=0”

猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/81324487
今日推荐