4.5 0-1揹包問題
給定乙個物品集合s={1,2,3,…,n},物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。
如果物品不能被分割,即物品i要麼整個地選取,要麼不選取;
不能將物品i裝入揹包多次,也不能只裝入部分物品i,則該問題稱為0-1揹包問題。
如果物品可以拆分,則問題稱為揹包問題,適合使用貪心演算法。
階段:i~n ,依次處理每一件物品
狀態:揹包的容量:0~v
決策:在第i階段,在揹包容量是v 的情況下,如何處理第i 件物品,才能使裝入揹包中的物品最大。
f[i][v]表示前i件物品(部分或全部)放入乙個容量為v的揹包可以獲得的最大價值。
處理方案:在w[i]>v的情況下,不裝入;否則,根據
max進行決策
狀態轉移方程便是:
f[i][v]=max。
#include
using namespace std;
const int maxm = 201, maxn = 31;
int m, n; int w[maxn], c[maxn]; int f[maxn][maxm];
int max(int x,int y) //求x和y最大值
int main()
4.6 最長單調遞增子串行
設計乙個o(n2)時間的演算法, 找出由n個數組成的序列的最長單調遞增子串行。
輸入: 第1個整數n(0=a[k],並且 b[k]=max(b[ j]), 1<=j<=i-1
所以:b[i]=b[k]+1.
如果存在k』, b[k』]>b[k] ,並且 a[i]>=a[k』],即
b[i]不是滿足條件的最大值。這與定義矛盾。
因此, 該問題滿足最優子結構性質。
用陣列b[0:i]記錄以a[i] (0≤i即k在0~(i-1)範圍內, 若a[k] ≤a[i], 尋找最大的b[k].
據此將計算b[i]轉化為i個規模更小的子問題。
#define num 100
int a[num]; //序列l
int lis_n2(int n) ; //輔助陣列b
int i,j;
b[1] = 1; //以a[1]結尾的子串行中只包含乙個元素
int max = 0; //陣列b的最大值
for (i=2;i<=n; i++)
return max;
}
動態規劃2
動態規劃是研究一類最優化問題的方法,在經濟 工程技術 企業管理 工農業生產及軍事等領域中都有廣泛的應用。近年來,在acm icpc中,使用動態規劃 或部分應用動態規劃思維 求解的題不僅常見,而且形式也多種多樣。而在與此相近的各類資訊學競賽中,應用動態規劃解題已經成為一種趨勢,這和動態規劃的優勢不無關...
動態規劃(2)
題目輸入格式 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2.r 1行 每行c個數,表示這個矩陣。輸出格式 僅一行 輸出1個整數,表示可以滑行的最大長度。樣例輸入 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 ...
動態規劃2
最長遞增子串行的問題 給定陣列arr,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為所以返回這個子串行的長度為5。解決方案 arr 2 1 5 3 6 4 8 9 7 dp 1 1 2 2 3 3 4 5 4 dp i 表示...