完全揹包
時間限制:3500 ms | 記憶體限制:65535 kb
難度:4
描述 直接說題意,完全揹包定義有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
思路:
要求揹包完全裝滿時的最大價值,初始化時給dp[1]~dp[v]設負無窮,dp[0]設0。
比如m = 1, v = 5, w = 2, c = 2時,
dp[0] = 0
dp[1] = -inf
dp[2] = max(dp[2], dp[0] + c) = dp[0] + c = 2
dp[3] = max(dp[3], dp[3-w] + c) = dp[1] + 2 = -inf + 2 = -inf
dp[4] = max(dp[4], dp[4-2] + c) = dp[2] + 2 = 4
dp[5] = max(dp[5], dp[5-2] + c) = dp[3] + 2 = -inf + 2 = -inf
**:
#include
#include
#include
#include
using
namespace
std;
#define inf 0x3f3f3f3f
const
int maxv = 50010;
const
int maxn = 2010;
int dp[maxv];
int w[maxn], v[maxn];
int main()
fill(dp, dp + maxv, -inf);
dp[0] = 0;
for(int i = 1; i <= m; ++i)
}if(dp[v] < 0) printf("no\n");
else
printf("%d\n", dp[v]);
}return
0;}
錯誤**感受一下…. 哭o(╥﹏╥)o…
#include
#include
#include
#include
using
namespace
std;
#define inf 0x3f3f3f3f
const
int maxv = 50010;
const
int maxn = 2010;
int dp[maxv];
int w[maxn], c[maxn];
int main()
fill(dp, dp + maxv, -inf);
dp[0] = 0;
for(int i = 1; i <= m; ++i)}}
if(dp[v] < 0) cout
<< "no"
<< endl;
else
cout
<< dp[v] << endl;
}return
0;}
NYOJ 311 完全揹包 完全揹包模型
時間限制 3500 ms 記憶體限制 65535 kb 難度 4描述 直接說題意,完全揹包定義 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包 恰好裝滿揹包時,求出最大...
完全揹包 nyoj 311
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...
NYOJ 311 完全揹包
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...