最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。
關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。
然而文章給了許多案例分析,卻沒有很好的練習。
說明:
1、本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。希望學習者學習揹包問題的時候能找到一些對應的題加以練習。
2、本文根據我是刷題中遇到的揹包問題,會不定期更新內容。
0-1 揹包問題
1、兌換獎券
基本解法:
#include #include #include using namespace std;
int main()
cout << dp[m] << endl;
} return 0;
}
如果要輸出最優方案,增加乙個state狀態陣列,修改**如下:
#include #include #include using namespace std;
int main()
} } cout << dp[m] << endl;
i = n;
j = m;
while (--i >= 0)
}} return 0;
}
2、和為m的組合的個數(求方案數)
在n個數中找出其和為m的若干個數。先讀入正整數n(1< n< 100)和m(1< m< 10000), 再讀入n個正數(可以有相同的數字,每個數字均在1000以內), 在這n個數中找出若干個數, 使它們的和是m, 把滿足條件的數字組合都找出來以統計組合的個數,輸出組合的個數(不考慮組合是否相同)
#include #include using namespace std;
int main()
cout << dp[m] << endl;
return 0;
}
完全揹包問題
1、兌換獎券
#include #include #include using namespace std;
int main()
cout << dp[m] << endl;
} return 0;
}
2、換零錢
(求方案數)
有乙個陣列changes,changes中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,對於乙個給定值x,計算組成這個值的方案數。
int countways(vectorchanges, int n, int x)
return dp[x];
}
3、換零錢(求最少硬幣數)
題解 分組揹包問題
不超過n元錢:
題解:泛化物品
提公升英雄:
題解:
動態規劃之揹包問題
一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...
動態規劃之 揹包問題
前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。三種揹包問題 0 1揹包,完全揹包,多重揹包。0 1揹包 有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。f i v 表示將前i件物品恰好放入容量為v的揹包可以...
動態規劃之揹包問題
vivo2019提前批筆試第三題 小v負責一次活動禮品採購,每一款禮品的受歡迎程度 熱度值 各不相同,現給出總金額以及各個禮品的單價 和熱度值,且每個禮品只購買乙個,如何購買可以使得所有禮品的總熱度值最高。輸入 第一行是乙個正整數,表示總金額 不大於1000 第二行是乙個長度為n的正整數陣列,表示禮...