01揹包
題目描述
許多年前,在泰迪的故鄉,有一個被稱爲“骨收集者”的人。這個人喜歡收集各種各樣的骨頭,比如狗的,牛的,還有他去墳墓的。
骨收集器有一個體積很大的V形包,在收集的過程中有很多骨頭,顯然,不同的骨頭有不同的價值和不同的體積,現在根據每次旅行的骨頭的價值,你能計算出骨收集器的總價值的最大值嗎?
輸入
第一行包含整數T,實例數。
其次是T型病例,每例三行,第一行包含兩個整數n,v,(n<=1000,v<=1000),表示骨的數量和袋的體積。第二行包含表示每個骨的值的n個整數。第三行包含代表每個骨體積的n個整數。
產量
每行一個整數表示總值的最大值(這個數字小於2)三十一)
樣本輸入
1、5、10、1、2、3、4、5、5 4 4 3 2
樣本輸出
14
const int maxn = 1e3 + 5;
//int w[3]={150,200,350};
int t, n, W;
int c[maxn];//體積
int w[maxn];//價值
int dp[maxn][maxn];
int solve() {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++)
for (int j = 0; j <= W; j++)
if (j >= c[i])
dp[i + 1][j] = max(dp[i][j], dp[i][j - c[i]] + w[i]);
else
dp[i + 1][j] = dp[i][j];
return dp[n][W];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
cin >> n >> W;
for (int i = 0; i < n; i++)
cin >> w[i];
for (int i = 0; i < n; i++)
cin >> c[i];
cout << solve() << endl;
}
return 0;
}