HDU 2602 Bone Collector(01背包问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35691619/article/details/78867855

如果直接搜索,会浪费大量时间搜索已知的结果,造成超时。

可以用记忆化数组记录已经搜索过的结果,在查询已知的结果时,直接返回即可



如果你不知道为什么错了,那么...........

请注意是先输入价值,后输入容量


利用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;
}


猜你喜欢

转载自blog.csdn.net/qq_35691619/article/details/78867855