01揹包問題--C語言程式碼
阿新 • • 發佈:2018-12-30
01揹包問題的解釋可以看百度百科:01揹包問題
自己不太懂,不過看這個程式碼好像有點理解的意思了,就先收藏一下程式碼吧
/********************************************************/ /*揹包問題:有m件物品和一個承重為t的揹包。 */ /* 第i件物品的重量是w[i],價值是v[i]。 */ /* 求解將哪些物品裝入揹包可使這些物品的 */ /* 重量總和不超過揹包承重量t,且價值總和最大。 */ /********************************************************/ #include <stdio.h> #include <string.h> int f[1010]; // 記錄不同承重量揹包的總價值 int w[1010]; // 記錄不同物品的重量 int v[1010]; // 記錄不同物品的價值 //返回x,y的最大值 int max(int x,int y) { if(x>y) return x; return y; } int main() { int t; // 揹包的承重量 int m; // 物品的數量 int i,j; // 臨時變數 memset(f,0,sizeof(f)); //總價值初始化為0 printf("請輸入揹包承重量 物品的數量:\n"); scanf("%d %d",&t,&m); //輸入揹包承重量t、物品的數目m printf("請輸入每件物品的重量 價值:\n"); for(i = 1; i <= m; i++) scanf("%d %d",&w[i],&v[i]); //輸入m組物品的重量w[i]和價值v[i] //嘗試放置每一個物品 for(i = 1; i <= m; i++) { for(j = t; j >= w[i]; j--) { //在放入第i個物品前後,檢驗不同j承重量揹包的總價值 //如果放入第i個物品後比放入前的價值提高了,則修改j承重量揹包的價值,否則不變 f[j] = max(f[j-w[i]]+v[i],f[j]); } } printf("裝入揹包的物品\"重量:價值\" :\n"); j=t; // 臨時記錄揹包重量 for(i=1;i<=m;i++) { // 如果物品被放入,一定符合這樣的條件 if(f[j] == f[j-w[i]] + v[i]) { printf("%d:%d\n",w[i],v[i]); j -= w[i]; } } printf("揹包最終重量 價值\n"); printf("%d %d\n",t,f[t]); getch(); return 0; }