多重揹包模板
多重揹包:有n種物品和乙個容量為v的揹包。第i種物品最多有numi件可用。
每件物品的重量是wi,價值是vi。
求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。
const int maxn = 100005;
int w[maxn], v[maxn], num[maxn];//w:重量 v:價值 num:數量 // w: weight, v:value, num:number
int dp[maxn];
int v; //v:容量
//01揹包
void zeroonepack(int w, int v)
}//完全揹包
void completepack(int w, int v)
}//多重揹包
void multiplepack(int w, int v, int num)
else
zeroonepack(num*w, num*v);
}}
例題
poj - 1276
思路:多重揹包裸題
直接套用模板
這裡注意的是物品的價值value等於其重量weight,即v[i] = w[i]
c++**如下:
/**
// 多重揹包:
// 有n種物品和乙個容量為v的揹包。第i種物品最多有numi件可用。
// 每件物品的重量是wi,價值是vi。
// 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。
*/#include #include #include #include using namespace std;
const int maxn = 100005;
int w[maxn], v[maxn], num[maxn];//w:重量 v:價值 num:數量 // w: weight, v:value, num:number
int dp[maxn];
int v; //v:容量
//01揹包
void zeroonepack(int w, int v)
}//完全揹包
void completepack(int w, int v)
}//多重揹包
void multiplepack(int w, int v, int num)
else
zeroonepack(num*w, num*v); }}
int main()
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
multiplepack(w[i], v[i], num[i]);
printf("%d\n", dp[v]);
} return 0;
}
多重揹包模板
有n種物品和乙個容量為v的揹包。第i種物品最多有num i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。多重揹包問題的思路跟完全揹包的思路非常類似,只是k的取值是有限制的,因為每件物品的數量是有限制的,狀態轉移方程為 dp i ...
多重揹包模板
多重揹包模板 1.多重揹包 優化 例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物...
模板 多重揹包
學習了二進位制優化,吼吼!寫個模板,雖然這種型別並不需要模板,但是寫乙個,備忘 模板 int dp n void onezeropack int v int n int w void completepack int v int n int w void multipliepack int v in...