日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DFS解01背包问题

發(fā)布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DFS解01背包问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

01背包問題的DFS解法

直接dfs未剪枝代碼

時間復(fù)雜度 O(2n^nn),其原因是對任意的物品,都是選或者不選(兩次的情況)

  • dfs三個形參
    物品序號index,放進(jìn)背包的重量sumW,以及放進(jìn)背包的總價(jià)值sumC
  • 主要搜索路徑
    序號為index的物品放入背包時
    序號為index的物品不放入背包時
  • //搜索路徑dfs(index+1,sumW+w[index],sumC+c[index]);//選第index件放入背包dfs(index+1,sumW,sumC);//不選第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à)值時更新。

    #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) return;//搜索路徑dfs(index+1,sumW,sumC);//不選第index件物品放入背包 if(sumW+w[index]<=V){if(sumC+c[index]>maxC)maxC=sumC+c[index];dfs(index+1,sumW+w[index],sumC+c[index]);//選第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;}

    對比剪枝前和剪枝后的代碼,程序得以優(yōu)化。

    總結(jié)

    以上是生活随笔為你收集整理的DFS解01背包问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。