// 零一背包 / 01背包
#include <bits/stdc++.h>
#include <windows.h>
#include <algorithm>
#include <stdlib.h>
#include <limits.h>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <ctime>
#define N 10001
#define add +
#define is =
using namespace std;
long long int t, v, n;
long long int f[N][N];
long long int c[N];
long long int w[N];
long long int ans;
int main() {
cout << "背包可承受总重量:";
cin >> v;
system( "cls" );
cout << "背包可承受总重量:" << v << "kg" << endl;
cout << "物品总个数:";
cin >> n;
system( "cls" );
cout << "背包可承受总重量:" << v << "kg" << endl;
cout << "物品总个数:" << n << "个" << endl;
cout << endl;
for ( int i = 1; i <= n; i++ ) {
system( "cls" );
cout << "第 " << i << " 件物品的重量:";
cin >> w[i];
system( "cls" );
cout << "第 " << i << " 件物品的重量:" << w[i] << "kg" << endl;
cout << "第 " << i << " 件物品的价值:";
cin >> c[i];
}
cout << "\n\n\n" << endl;
for ( int i = 1; i <= n; i++ ) {
for ( int j = 0; j <= v; j++ ) {
if ( j >= w[i] ) {
f[i][j] = max( f[i - 1][j], f[i - 1][j - w[i]] + c[i] );
} else {
f[i][j] = f[i - 1][j];
}
}
}
cout << "最大价值 = " << f[n][v];
return 0;
}
// 完全背包
#include <bits/stdc++.h>
#include <windows.h>
#include <algorithm>
#include <stdlib.h>
#include <limits.h>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <ctime>
#define N 10001
#define add +
#define is =
using namespace std;
long long int f[N][N];
long long int c[N];
long long int w[N];
long long int v, n;
long long int ans;
int main() {
cout << "背包可承受总重量:";
cin >> v;
cout << "物品总个数:";
cin >> n;
cout << endl;
for ( int i = 1; i <= n; i++ ) {
cout << "第 " << i << " 件物品的重量:";
cin >> w[i];
cout << "第 " << i << " 件物品的价值:";
cin >> c[i];
}
cout << "\n\n\n" << endl;
for ( int i = 1; i <= n; i++ ) {
for ( int j = 0; j <= v; j++ ) {
if ( j >= w[i] ) {
f[i][j] = max( f[i - 1][j], f[i][j - w[i]] + c[i] );
} else {
f[i][j] = f[i - 1][j];
}
}
}
cout << "最大价值 = " << f[n][v];
return 0;
}
// 多重背包
#include <bits/stdc++.h>
#include <windows.h>
#include <algorithm>
#include <stdlib.h>
#include <limits.h>
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <ctime>
#define N 10001
#define add +
#define is =
using namespace std;
const int N = 10005;
int n, m;
int tot;
int v[10001];
int q[10001];
int w[10001];
int tw[100001];
int tv[100001];
int f[10001];
int main() {
cout << "背包可承受总重量:";
cin >> n;
cout << "物品总个数:";
cin >> m;
for ( int i = 1; i <= n; i++ ) {
cout << "第 " << i << " 件物品的最大数量:";
cin >> v[i];
cout << "第 " << i << " 件物品的重量:";
cin >> q[i];
cout << "第 " << i << " 件物品的价值:";
cin >> w[i];
}
for ( int i = 1; i <= n; i++ ) {
for ( int j = 1; j <= q[i]; j <<= 1 ) {
tw[++tot] = j * w[i];
tv[tot] = j * v[i];
q[i] = q[i] - j;
}
if ( q[i] ) {
tw[++tot] = q[i] * w[i];
tv[tot] = q[i] * v[i];
}
}
for ( int i = 1; i <= tot; i++ ) {
for ( int j = m; j >= tw[i]; j-- ) {
f[j] = max( f[j], f[j - tw[i]] + tv[i] );
}
}
cout << "最大价值 = " << f[m];
return 0;
}
三种基础背包动态规划模板
于 2024-01-20 15:12:00 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)