相关文章推荐
调皮的硬盘  ·  为什么 ...·  2 年前    · 

直接DFS,对每件物品根据选与不选进行搜索。当前总价值已经大于答案或者已经满足条件了就显然没有搜索必要,对答案更新后直接回溯即可;所有物品被搜完作为搜索的最终边界。

时间复杂度较大,只能70pts。

挺明显的01背包,直接求出所有容量对应的价值后,找大于等于 m 且最小的背包价值即可。

DFS(70pts)

#include<bits/stdc++.h>
const int INF = 0x3f3f3f3f;
using namespace std;
int n, m;
int ans = INF;
int val[10010];
void DFS(int now, int sum)
	if(sum > ans) return;
	if(sum >= m)
		ans = min(ans, sum);
		return;
	if(now > n) return;
	DFS(now + 1, sum + val[now]);
	DFS(now + 1, sum);
	return;
int main()
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		cin >> val[i];
	DFS(1, 0);
	cout << ans;
	return 0;

DP(100pts)

#include<bits/stdc++.h>
const int INF = 0x3f3f3f3f;
using namespace std;
int n, m, ans = INF;
int val[101];
int dp[300010];
int main()
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		cin >> val[i];
	for(int i = 1; i <= n; i++)
		for(int j = 300001; j >= val[i]; j--)
			dp[j] = max(dp[j], dp[j - val[i]] + val[i]);
	for(int i = 1;i <= 300001;i++)
		if(dp[i] >= m)
			ans = min(ans, dp[i]);
	cout << ans;
	return 0;