倒计时69天

题单详情 - 蓝桥云课

动态规划:

1.1.健身 - 蓝桥云课 (lanqiao.cn)

//完全背包问题
#include 
using namespace std;
#define int long long
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;
int a[N], day[N], v[110], w[110], dp[N];

void solve() {
	int n, m, q, k, s, ans = 0;
	cin >> n >> m >> q;
	for (int i = 1; i <= q; i++)
		cin >> a[i];
	int kk = 1;
	//背包个数及大小用day数组表示
	day[1] = a[1] - 1;
	for (int i = 2; i <= q; i++) {
		day[++kk] = a[i] - a[i - 1] - 1;
	}
	day[++kk] = n - a[q];
	for (int i = 1; i <= m; i++) {
		cin >> k >> s;
		v[i] = pow(2, k);
		w[i] = s;
	}
	for (int l = 1; l <= kk; l++) {
		int V = day[l];
		for (int i = 1; i <= m; i++) { //物品
			for (int j = v[i]; j <= V; j++) {
				dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
			}
		}
		ans += dp[V];
	}
	cout << ans;
}
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	solve();
	return 0;
}

你可能感兴趣的:(c++)