关于01背包
  • 板块学术版
  • 楼主yfhshtk
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/10/16 21:34
  • 上次更新2024/10/17 08:11:09
查看原帖
关于01背包
1173402
yfhshtk楼主2024/10/16 21:34

想知道求01背包恰好装满最大价值的最优复杂度是多少?以及如下代码是否正确,可不可优化?

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;
//设f[i][j]表示只考虑前i个物品, 总容量恰好为j所能得到的最大价值
//考虑当前第i个物品选或不选
//f[i][j] = max{f[i - 1][k]} (k >= 0)
//f[i][j] = max{f[i - 1][k - v[i]] + w[i]) (k >= v[i])
const ll MAXN = 110;
const ll MAXM = 1e3 + 5;
const ll INF = -1e18;

ll n, m, v[MAXN], w[MAXN], dp[MAXN][MAXM], ans = INF;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for(ll i = 1; i <= n; ++i) {
		for(ll j = 1; j <= m; ++j) {
			dp[i][j] = INF;
		}
	}
	for(ll i = 1; i <= n; ++i) {
		cin >> v[i] >> w[i];
	}
	for(ll i = 1; i <= n; ++i) {
		for(ll j = 1; j <= m; ++j) {
			for(ll k = 0; k <= j; ++k) {
				dp[i][j] = max(dp[i][j], dp[i - 1][k]);
				if(k >= v[i]) {
					dp[i][j] = max(dp[i][j], dp[i - 1][k - v[i]] + w[i]);
				}
			}
		}
	}
	for(ll i = 0; i <= m; ++i) {
		ans = max(ans, dp[n][i]);
	}
	cout << ans;
	return 0;
}
/*
3 70
71 100
69 1
1 2
*/
2024/10/16 21:34
加载中...