多重揹包模板 C

2021-09-24 15:17:11 字數 1601 閱讀 2565

多重揹包模板

多重揹包:

有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...