時限:1000ms記憶體限制:10000k總時限:3000ms
描述:
需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi ,價值為pi 。對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。
輸入:
多個測例,每個測例的輸入佔三行。第一行兩個整數:n(n<=10)和c,第二行n個整數分別是w1到wn,第三行n個整數分別是p1到pn。
n 和 c 都等於零標誌輸入結束。
輸出:
每個測例的輸出佔一行,輸出乙個整數,即最佳裝載的總價值。
輸入樣例:
1 2
1 1
2 3
2 2
3 4
0 0輸出樣例:1 4
回溯法也稱為試探法,該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一列舉和檢驗。當發現當前候選解不可能是解時,就選擇下乙個候選解;倘若當前候選解除了還不滿足問題規模要求外,滿足所有其他要求時,繼續擴大當前候選解的規模,並繼續試探。如果當前候選解滿足包括問題規模在內的所有要求時,該候選解就是問題的乙個解。在回溯法中,放棄當前候選解,尋找下乙個候選解的過程稱為回溯。擴大當前候選解的規模,以繼續試探的過程稱為向前試探。
回溯法常見形式有搜尋排列樹和搜尋子集樹兩種型別,此題使用了搜尋子集樹的形式。
#include
using
namespace
std;
int w[10],p[10],a[10],n,c,value=0,big=0;
void search(int m);
void check();//檢測重量條件是否滿足
void checkmax();//檢測最值
int main()
return0;}
void search(int m)
else
} void check()
}if(weight<=c)
checkmax();
}void checkmax()
}if(value>big)
big=value;
}
回溯法 0 1揹包問題
0 1揹包問題 給定n種物品和一揹包.物品i的重量是wi,其價值為ui,揹包的容量為c.問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 0 1揹包是子集合選取問題,一般情況下0 1揹包是個np問題.第一步 確定解空間 裝入哪幾種物品 第二步 確定易於搜尋的解空間結構 可以用陣列p,w...
0 1揹包問題 回溯法
0 1揹包問題 回溯法 一 專案描述 每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。二 演算法設計 a.物品有n種,揹包容量為c,分別用p i 和w i 儲存第i種物品的價值和重量,用x i...
回溯法 0 1揹包問題
include include using namespace std class knap void knap backtrack int i 對第i個物品進行操作 return 如果沒有到葉子節點,就要對這個節點進行操作,即搜尋它的子樹,進入做左子樹表示可以選第i個,進入右子樹表示不能選第i個 ...