日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划(0-1背包)--- 改变一组数的正负号使得它们的和为一给定数

發(fā)布時間:2023/12/2 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划(0-1背包)--- 改变一组数的正负号使得它们的和为一给定数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

改變一組數(shù)的正負號使得它們的和為一給定數(shù)

494. Target Sum (Medium)

Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5 Explanation:-1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3There are 5 ways to assign symbols to make the sum of nums be target 3.

題目描述:

??給定一個全為1的數(shù)組,和一個目標值,數(shù)組中每個元素可正可負,求出可以有多少種組合使得數(shù)組的和為目標值。

思路分析:

??我們將添加“+”的數(shù)放入集合P,其它的數(shù)放入集合N,于是我們有:

sum(P) - sum(N) = target sum(P) + sum(N) = sum

??于是有sum(P) = (target + sum) / 2,那么不妨這樣理解題意,從一個數(shù)組中選定一些數(shù),使它們的和為sum(P),如此就變成了很經(jīng)典的0/1背包問題,從一個n大小的背包中選出總和為sum(P)的方案個數(shù)。

??狀態(tài)表示:dp[i] [j]代表前i個數(shù)中和為j的方案個數(shù)。
??狀態(tài)轉(zhuǎn)移方程:dp [i] [j] = dp[i-1] [j] + dp[i-1] [j-nums[i]],dp [0] [0] = 1
??返回結(jié)果:dp[n] [target],n為數(shù)組大小,target為sum(P)。

代碼:

public int findTargetSumWays(int []nums,int S){int sum=0;for(int num:nums){sum=sum+num;}int target=(sum+S)/2;int []dp=new int[target+1];dp[0]=1;for(int num:nums){for(int i=target;i>=num;i--){dp[i]=dp[i]+dp[i-num];}}return dp[target]; }

DFS解法

public int findTargetSumWays(int[]nums,int S){return findTargetSumWays(int[]nums,int S); } private int findTargetSumWays(int []nums,int start int S){if(start==nums.length){return S==0?1:0;}return findTargetSumWays(nums,start+1,S-nums[start])+findTargetSumWays(nums,start+1,S+nums[start]); }

轉(zhuǎn)載于:https://www.cnblogs.com/yjxyy/p/11119414.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的动态规划(0-1背包)--- 改变一组数的正负号使得它们的和为一给定数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。