1.有n個物品,每個物品都有重量和**,在不超過揹包容量v的情況下選出**之和最大,求最大價值maxvalue。
思路,每個物品都有2種方法,選擇或不選擇,相當於迷宮的岔路口,遞迴中的遞迴式。而當物品總重量超過揹包容量v,在相當於迷宮中的死胡同,遞迴中的遞迴邊界。通過列舉所有選擇方案,來得出最優解。
其中dfs是常規解,dfs_better是用了剪枝技巧的優化解
#include using namespace std;
const int maxn = 30;
int n,v,maxvalue = 0;
int w[maxn],c[maxn];
//index為當前物品編號,sumw,sumc為當前的總重量和總價值
void dfs(int index, int sumw, int sumc)
return ;
} //岔道口,選擇還是不選擇
dfs( index+1, sumw, sumc); //不選擇第index號物品,index(0~n-1);
dfs( index+1, sumw+w[index], sumc+c[index]); //選擇第index號物品,則加上其重量和價值
} //優化後的
void dfs_better(int index ,int sumw, int sumc)
dfs(index+1, sumw + w[index],sumc + c[index]);
}} int main()、 、 、、 {2,3)、{1,2,3)。列舉所有子串行的目的很明顯―可以從中選擇乙個 「最優」子串行,使它的某個特徵是所有子串行中最優的;如果有需要,還可以把這個最優子 序列儲存下來。顯然,這個問題也等價於列舉從n個整數中選擇k個數的所有方案。
演算法筆記(DFS)
輸入兩個整數 n 和 m,從數列1,2,3 n 中隨意取幾個數,使其和等於 m 要求將其中所有的可能組合列出來 從1 n找到數字之和等於m,那麼如果我先找到乙個數1,剩下的任務就是在2 m 1找到求和等於m 1就夠了。那如果找到第2個數2求和小於 找到的1 2求和為3 m,接下來找3,繼續這樣往下找...
演算法實驗二 (DFS 回溯) 8皇后問題
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述輸出8皇后問題所有結果。輸入沒有輸入。輸出每個結果第一行是no n 的形式,n表示輸出的是第幾個結果 下面8行,每行8個字元,a 表示皇后,表示空格。不同的結果中,先輸出第乙個皇后位置靠前的結果 第乙個皇后位置相同,先輸出第二個...
演算法筆記之DFS與 BFS
基本思想 深度優先搜尋 dfs,depth first search 它從某個狀態開始,不斷的轉移狀態直到無法轉移狀態,然後回退到前一步的狀態,繼續轉移到其它狀態,如此不繼重複,直至找到最終的解。寬度優先搜尋 bfs,breadth first search 總是先搜尋距離初始狀態近的狀態,也就是說...