背包DP模板

01背包

01背包-1

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

const int N = 1e5 + 10;
int n, m, f[N][N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> v[i] >> w[i];
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= m; j++) {
			if (j < v[i]) 
				f[i][j] = f[i - 1][j];
			else 
				f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
		}
	}
	cout << f[n][m] << endl;
	
	return 0;
}

01背包-2

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

const int N = 1e5 + 10;
int n, m, f[N], g[N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> v[i] >> w[i];
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= m; ++j) {
			if (j < v[i]) 
				g[j] = f[j];
			else
				g[j] = max(f[j], f[j - v[i]] + w[i]);
		}
		memcpy(f, g, sizeof g);
	}
	cout << f[m] << endl;
	
	return 0;
}

01背包-3

在这里插入图片描述

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

const int N = 1e5 + 10;
int n, m, f[N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> v[i] >> w[i];
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = m; j >= v[i]; --j) {
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		}
	}
	cout << f[m] << endl;
	
	return 0;
}

完全背包

完全背包-1

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

const int N = 1e5 + 10;
int n, m, f[N][N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
		cin >> v[i] >> w[i];
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= m; ++j) {
			if (j < v[i])
				f[i][j] = f[i - 1][j];
			else
				f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]);
		}
	}
	cout << f[n][m] << endl;
	
	return 0;
}

完全背包-2

在这里插入图片描述

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

const int N = 1e5 + 10;
int n, m, f[N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
		cin >> v[i] >> w[i];
	for (int i = 1; i <= n; ++i) {
		for (int j = v[i]; j <= m; ++j) {
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		}
	}
	cout << f[m] << endl;
	
	return 0;
}

完全背包-2(恰好装满m)

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

const int N = 1e5 + 10;
int n, m, f[N], v[N], w[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
		cin >> v[i] >> w[i];
	
	memset(f, 128, sizeof f); // 初始化为负无限大
	f[0] = 0;
	
	for (int i = 1; i <= n; ++i) {
		for (int j = v[i]; j <= m; ++j) {
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		}
	}
	cout << f[m] << endl;
	
	return 0;
}

多重背包

多重背包-1 (n <= 100)

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

const int N = 1e5 + 10;
int n, m, f[N], v[N], w[N], l[N];

int main() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
		cin >> v[i] >> w[i] >> l[i];

	for (int i = 1; i <= n; ++i) {
		for (int k = 1; k <= l[i]; ++k) {
			for (int j = m; j >= v[i]; --j) {
				f[j] = max(f[j], f[j - v[i]] + w[i]);
			}
		}
	}
	cout << f[m] << endl;
	
	return 0;
}

相关推荐

  1. 01背包问题dp

    2024-03-27 11:04:02       20 阅读
  2. 01背包dp问题

    2024-03-27 11:04:02       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-27 11:04:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-27 11:04:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-27 11:04:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-27 11:04:02       18 阅读

热门阅读

  1. C++ Lists(链表)基本用法

    2024-03-27 11:04:02       16 阅读
  2. Github 2024-03-26 开源项目日报 Top10

    2024-03-27 11:04:02       15 阅读
  3. 检查文件是否为图片或者视频

    2024-03-27 11:04:02       17 阅读
  4. 智能媒体时代认知安全的关键资源

    2024-03-27 11:04:02       16 阅读
  5. [蓝桥杯 2015]机器人数目

    2024-03-27 11:04:02       17 阅读
  6. C#学习3--实验:索引器和接口

    2024-03-27 11:04:02       14 阅读
  7. 微信小程序对于回调函数异步API的优化

    2024-03-27 11:04:02       17 阅读