部分和問題

0-1部分和

  • 問題描述:有n個大小不同的數字a,判斷是否能從中取出若干個數,使得這些數的和為k。
  • 解決思路:利用DFS(深度優先搜索)來解決,用dfs(i,j)表示前i個數字能否得到部分和j,則根據前i+1個數的能否得到部分和j或j+a[i+1]來判斷dfs(i,j)的狀態,算法如下:
1 bool dfs(int i,int sum)
2 {
3     if(i==n) return sum==k;
4     if(dfs(i+1,sum)) return true;
5     if(dfs(i+1,sum+a[i+1])) return true;
6     return false;
7 }

  或者也可以將此問題轉化為0-1背包問題求解,第i件物品的重量和價值均為a[i],判斷能否恰好將某些物品放入容量為k的背包中。

多重部分和

  • 問題描述:有n個大小不同的數字a,每個數有m個,判斷能否從中取出若干個數,使得這些數的和為k。
  • 方法1:利用動態規劃求解,dp[i][j]表示前i個數能否構成部分和j,時間復雜度為O(nkm)算法如下:
1 dp[n+1][k+1];
2 dp[0][0]=1;
3 
4 for(int i=0; i<n; i++)
5     for(int j=0; j<=k; j++)
6         for(int s=0; s<=m[i]&&s*a[i]<=j; s++)
7             dp[i+1][j] |= dp[i][j-s*a[i]];
  • 方法2:利用動態規劃求解,dp[i][j]表示用前i個數得到部分和時,第i個數最多能剩余多少個,dp[i][j]被初始化為-1,dp[i][j]>-1表示前i個數能得到部分和j,算法的偽代碼如下:
    if dp[i-1][j]>=0 dp[i][j]=m[i];
    else if(a[i]>j || dp[i][j-a[i]])<=0) dp[i][j]=-1;
    else dp[i][j]=dp[i][j-a[i]]-1;

    對以上算法可以優化空間復雜度,用cn[j]表示狀態dp[i][j],則算法如下:

    1 memset(cn,-1,sizeof(cn));
    2 dp[0]=0;
    3 
    4 for(int i=0; i<n; i++)
    5     for(int j=0; j<=k; j++)
    6         if(dp[j]>=0) dp[j]=m[i];
    7         else if(j<a[i] || dp[j-a[i]]<=0) dp[j]=-1;
    8         else dp[j]=dp[j-a[i]]-1;

    ?

轉載于:https://www.cnblogs.com/leeshine/p/4330298.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗 6 數組1

//輸入n個整數&#xff0c;將它們存入數組a中。輸出最大值和它所對應的下標。 #include<stdio.h> int main(void) {int n,i,x;int a[10];x0;printf("enter n:");scanf("%d",&n);for(i0;i<n;i){printf("enter :");scanf("%d&qu…

初中計算機職稱答辯,晉升中學語文高級教師職稱答辯內容舉例

晉升中學語文高級教師職稱答辯內容舉例 晉升中學語文高級教師職稱答辯秘籍 最重要的一點&#xff1a;你要對課本上的重點篇目非常熟悉&#xff01;對于現代文來說作者、題材、課文重點、重點句子詞語、中心思想等你都要明了。對于文言文來說&#xff0c;要求學生掌握的&#xf…

SDM For Face Alignment流程介紹及Matlab代碼實現之測試篇

測試很簡單了&#xff0c;只需要載入數據&#xff0c;然后做正則化處理&#xff0c;使用訓練模型產生的{Rk},就可以預測特征點了。 face_alignment.m:用來預測特征點 function shape face_alignment( ShapeModel, DataVariation,...LearnedCascadedModel, Data, img, shape,…

Flink – JobManager.submitJob

JobManager作為actor&#xff0c; case SubmitJob(jobGraph, listeningBehaviour) >val client sender()val jobInfo new JobInfo(client, listeningBehaviour, System.currentTimeMillis(),jobGraph.getSessionTimeout)submitJob(jobGraph, jobInfo) submitJob&#xff0…

window內容

window parent top location.href location.reload location.replace轉載于:https://www.cnblogs.com/carlos-guo/p/3391784.html

計算機類公務員如何提升自己,大學畢業才發現:所學專業對考公務員如此重要,4類專業上岸率高...

導語&#xff1a;畢業季來臨&#xff0c;同學們是想直接找工作積累工作經驗&#xff0c;還是繼續考取相關證書&#xff0c;來獲得更穩定職業的入場券&#xff1f;畢業抉擇很多畢業生面臨的第一個問題就是未來職業規劃&#xff0c;因為大學畢業之后&#xff0c;就意味著一段新的…

使用getline讀入

直接上代碼&#xff1a; 第一份&#xff1a;從cin 讀入多行數字&#xff0c;每行2個。當輸入完畢后&#xff0c;按2次回車結束 #include<iostream> #include <cstdio> #include <sstream> #include <string> #include <vector> #include <it…

POJ 1221

整數劃分 劃分成單峰的回文數列 dp[i][j] 表示 把i劃分&#xff0c;其中劃分的數不能大于j 1             i1或j1 dp[i][j]  dp[i][j-1]1         ji dp(i,j-1)dp(i-j,min(i-j,j)) i>j>1 1 #include <iostream>2 #include <cstd…

HYSBZ - 1050(旅行comf 并查集Java實現)

HYSBZ - 1050(旅行comf Java實現) 原題地址 解法&#xff1a;枚舉每一條邊&#xff0c;對于這條邊&#xff0c;我們需要找到集合中和其值相差最小的最大邊&#xff0c;這個集合是指與包括i邊在內的ST聯通集。對于這一要求&#xff0c;我們只需對所有的邊進行從小到大的排序&…

UVA 11401 - Triangle Counting

Problem G Triangle Counting Input: Standard Input Output: Standard Output You are given n rods of length 1, 2…, n. You have to pick any 3 of them & build a triangle. How many distinct triangles can you make? Note that, two triangles will be considere…

蘇州軟件測試11k工資要什么水平,3個月從機械轉行軟件測試,他的入職薪資是11K...

原標題&#xff1a;3個月從機械轉行軟件測試&#xff0c;他的入職薪資是11K只要找到適合自己的學習方式&#xff0c;成功轉行只是早晚的問題&#xff01;今天匯智妹給大家介紹的這位小伙伴&#xff0c;是咱們匯學聯盟平臺上的一位線上學員——小周。97年的小哥哥&#xff0c;19…

python idle 清屏問題的解決

在學習和使用python的過程中&#xff0c;少不了要與python idle打交道。但使用python idle都會遇到一個常見而又懊惱的問題——要怎么清屏?我在stackoverflow看到這樣兩種答案&#xff1a;1.在shell中輸入1 import os 2 os.system(cls) 這種方法只能在windows系統中cmd模式下的…

TCP/IP 原理--鏈路層

鏈路層作用&#xff1a; &#xff08;1&#xff09;為IP模塊發送和接收IP數據報&#xff1b; &#xff08;2&#xff09;為ARP發送ARP請求和接受ARP應答 &#xff08;3&#xff09;為RARP發送RARP請求和接受ARP應答 協議&#xff1a;以太網和SLIP協議 A.以太網協議數據封裝格式…

Sqoop拒絕連接錯誤

使用Sqoop遠程連接MySQL導入數據到HBase數據庫&#xff1a; sqoop import --driver com.mysql.jdbc.Driver --connect "jdbc:mysql://hzhiServer:3306/myssh?autoReconnecttrue" --table table_001 --username hadoop --password 1 --hbase-table table_001 --colum…

拆解凹多邊形

偶遇需要拆解凹多邊形 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Media;namespace DrawPolygon {public static class Settings{public const float…

計算機教學的弊端,信息技術在教學中的利弊及解決對策

摘 要&#xff1a;信息技術教育已成為國家信息化事業的重要組成部分&#xff0c;是當今素質教育的重要內容之一。從闡述信息技術教育的內涵和發展階段出發&#xff0c;分析了當前信息技術在教學應用中的優勢和存在的問題&#xff0c;并提出了相應的解決對策。關鍵詞&#xff1a…

【轉】Linux命令之查看文件占用空間大小-du,df

原文網址&#xff1a;http://blog.csdn.net/wangjunjun2008/article/details/19840671 du(disk usage),顧名思義,查看目錄/文件占用空間大小#查看當前目錄下的所有目錄以及子目錄的大小$ du -h $ du -ah #-h:用K、M、G的人性化形式顯示 #-a:顯示目錄和文件 du -h tmp du -ah tm…

一個FORK的面試題

為什么80%的碼農都做不了架構師&#xff1f;>>> #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i0; i<2; i){ fork(); printf("-"); } wait(NULL); wait(NULL); return 0; }/c 如果…

C++11系列學習之二-----lambda表達式

C11添加了一項名為lambda表達式的新功能&#xff0c;通過這項功能可以編寫內嵌的匿名函數&#xff0c;而不必編寫獨立函數和函數對象&#xff0c;使得代碼更容易理解。lambda表達式的語法如下所示&#xff1a;[capture_block](parameters) exceptions_specification -> retu…

php四種基礎算法:冒泡,選擇,插入和快速排序法

許多人都說 算法是程序的核心&#xff0c;一個程序的好于差,關鍵是這個程序算法的優劣。作為一個初級phper&#xff0c;雖然很少接觸到算法方面的東西 。但是對于冒泡排序&#xff0c;插入排序&#xff0c;選擇排序&#xff0c;快速排序四種基本算法&#xff0c;我想還是要掌握…