完全揹包
- 描述
-
直接說題意,完全揹包定義有N種物品和一個容量爲V的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出NO
- 輸入
- 第一行: N 表示有多少組測試數據(N<7)。
接下來每組測試數據的第一行有兩個整數M,V。 M表示物品種類的數目,V表示揹包的總容量。(0<M<=2000,0<V<=50000)
接下來的M行每行有兩個整數c,w分別表示每種物品的重量和價值(0<c<100000,0<w<100000) - 輸出
- 對應每組測試數據輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出NO)
- 樣例輸入
-
2 1 5 2 2 2 5 2 2 5 1
- 樣例輸出
-
NO 1
題目地址:nyoj 311
AC代碼:
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n;scanf("%d", &n);
while(n--)
{
int i, j, m, v;
int f[50005], c[100005], w[100005];
scanf("%d %d", &m, &v);
for(i = 0; i < m; i++)
scanf("%d %d", &c[i], &w[i]);
memset(f, -1000000, sizeof(f));
f[0] = 0;
for(i = 0; i < m; i++)
{
for(j = c[i]; j <= v; j++)
{
if(j >= c[i])
f[j] = max(f[j], f[j-c[i]]+w[i]);
}
}
printf(f[v]<0 ? "NO\n" : "%d\n", f[v]);
}
return 0;
}