揹包問題:是一種組合優化的np完全問題;問題可以描述為:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,
我們如何選擇,才能使得物品的總**最高。
思想:特點是:每種物品僅有一件,可以選擇放或不放用子問題定義狀態:即f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程。便是:f[i][v]=max。可以壓縮空間,f[v]=max;這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:「將前i件物品放入容量為v的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能獲得的最大價值就是f [i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。
注意f[v]有意義當且僅當存在乙個前i件物品的子集,其費用總和為v。所以按照這個方程遞推完畢後,最終的答案並不一定是f[n] [v],而是f[n][0..v]的最大值。如果將狀態的定義中的「恰」字去掉,在轉移方程中就要再加入一項f[v-1],這樣就可以保證f[n] [v]就是最後的答案。至於為什麼這樣就可以,由你自己來體會了。
#includeusing namespace std;
void kanpsack_dp(int c[50][50],int w[50],int v[50],int n,int c)
for(int i=1;i<=n;i++)
else c[i][j]=c[i-1][j];
} }}void output_stack(int c[50][50],int x[50],int w[50],int n,int c)
} x[1]=c[1][c]?1:0;
}int main()
cout<<"依次輸入物品得價值:"<>v[i];
} kanpsack_dp(c,w,v,n,c);
output_stack(c,x,w,n,c);
cout<<"最優解為:"<
第七周作業作業
1 自建yum倉庫,分別為網路源和本地源 建立yum配置檔案,類似如下 base name base baseurl file misc cd gpgcheck 0 epel name epel baseurl gpgcheck 0 enabled 1 本地源 以前自己整理的 2 編譯安裝http2...
第七周作業
書中習題1 說說下列程式的執行過程和運算結果 include includeusing namespace std double squ double x 函式原形 int main 主函式 書2,不用庫函式,求整數次冪 3.程式設計實現輸入兩個4x5矩陣和5x3矩陣,定義函式並在主函式中呼叫計算它...
第七周作業
1 列舉常見的核心引數以及引數的意義 1 net.ipv4.ip forward 資料報的路由 開關,設定為1表示開啟,0表示關閉。2 vm.drop caches 清空caches,釋放記憶體占用。設定為1表示清空 pagecache,設定為2表示清空 dentries 和 inodes,設定為3...