1. 程式人生 > >HDU 2602 Bone Collector(01揹包問題)

HDU 2602 Bone Collector(01揹包問題)

如果直接搜尋,會浪費大量時間搜尋已知的結果,造成超時。

可以用記憶化陣列記錄已經搜尋過的結果,在查詢已知的結果時,直接返回即可



如果你不知道為什麼錯了,那麼...........

請注意是先輸入價值,後輸入容量


利用dp可以更好的處理,提升效率

void solve(int i, int j) {
	for (int i = 0; i <= N; i++) {
		for (int j = 0; j <= V; j++) {
			if (j < weight[i]) {
				dp[i+1][j] = dp[i][j];
			} else {
				dp[i+1][j] = max(dp[i][j], dp[i][j-weight[i]]+value[i]);
			}
		}
	}

	printf("%d\n", dp[N][V]);

}



搜尋如下

#include<stdio.h>
#include<string.h>

int N, V;
int weight[1005], value[1005];
int dp[1005][1005];
int max(int a, int b) {
	return a>b?a:b;
}

int solve(int i, int j) {

	if (dp[i][j] >= 0) {
		return dp[i][j];
	}

	int sum;
	if (i == N) {
		sum = 0;
	} else if (j < weight[i]) {
		sum = solve(i+1, j);
	} else {
		sum = max(solve(i+1, j), solve(i+1, j - weight[i]) + value[i]);
	}
	return dp[i][j] = sum;
}

int main(void)
{
	int n;
	scanf("%d", &n);

	while (n--) {
		scanf("%d %d", &N, &V);

    for (int i = 0; i < N; i++) {
				scanf("%d", &value[i]);
    }

    for (int i = 0; i < N; i++) {
			scanf("%d", &weight[i]);
    }
		memset(dp, -1, sizeof(dp));
		printf("%d\n", solve(0, V));
	}

	return 0;
}