DFS解01背包问题
生活随笔
收集整理的這篇文章主要介紹了
DFS解01背包问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
01背包問題的DFS解法
直接dfs未剪枝代碼
時間復(fù)雜度 O(2n^nn),其原因是對任意的物品,都是選或者不選(兩次的情況)
物品序號index,放進(jìn)背包的重量sumW,以及放進(jìn)背包的總價(jià)值sumC
序號為index的物品放入背包時
序號為index的物品不放入背包時
代碼
#include<iostream> using namespace std; const int maxn=100; int n,maxC=0,V,w[200],c[200];void dfs(int index,int sumW,int sumC ){//出口if(index==n){//遍歷完所有 if(sumW<=V&&sumC>maxC)maxC=sumC;return ;} //搜索路徑dfs(index+1,sumW+w[index],sumC+c[index]);//選第index件放入背包dfs(index+1,sumW,sumC);//不選第index件放入背包 } int main(){cin>>n>>V;//n件物品,V背包容量 for(int i=0;i<n;i++)cin>>w[i]>>c[i];//w重量,c價(jià)值dfs(0,0,0);//初始化index,sumW,sumC都為0 cout<<maxC<<endl;return 0;}剪枝
選擇第index件物品放入背包之前,先檢查重量是否超過背包容量V,如果超過,便不進(jìn)入dfs遞歸分支。
而且更新最大價(jià)值maxC也不需要無時無刻更新,只需要在當(dāng)?shù)趇ndex件物品放入背包后的價(jià)值超過放進(jìn)背包之前的價(jià)值時更新。
對比剪枝前和剪枝后的代碼,程序得以優(yōu)化。
總結(jié)
以上是生活随笔為你收集整理的DFS解01背包问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51Nod - 2142身份证号排序
- 下一篇: Leetcode334反转字符串[C++