01揹包_ACM模板

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章