题单主要是鼠群群友书写的感觉还不错,就先拿这个练练手吧。链接:https://vjudge.net/article/8781
随手写了道代码随想录: https://kamacoder.com/problempage.php?pid=1046
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, bagweight;
cin >> n >> bagweight;
vector<int> weights(n, 0);
vector<int> values(n, 0);
for (int i = 0; i < n; i++) cin >> weights[i];
for (int i = 0; i < n; i++) cin >> values[i];
vector<vector<int>> dp(weights.size(), vector<int>(bagweight + 1, 0));
for (int j = weights[0]; j < bagweight + 1; j++) dp[0][j] = values[0];
for (int i = 1; i < n; i ++){
for (int j = 0; j <= bagweight; j++){
if (j < weights[i]) dp[i][j] = dp[i - 1][j];
if (j >= weights[i]) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]);
}
}
cout << dp[n - 1][bagweight] << endl;
return 0;
}
洛谷-P1048
//经典的01背包问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int T, M;
cin >> T >> M;
vector<int> values(M, 0);
vector<int> times(M, 0);
vector<vector<int>> dp(M, vector<int>(T + 1, 0));
for (int i = 0; i < M; i++){
cin >> times[i] >> values[i];
}
for (int j = times[0]; j < T + 1; j++) dp[0][j] = values[0];
for (int i = 1; i < M; i++){
for (int j = 0; j <= T; j++){
if (j < times[i]) dp[i][j] = dp[i - 1][j];
if (j >= times[i]) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - times[i]] + values[i]);
}
}
cout << dp[M - 1][T];
return 0;
}
洛谷-U291802
//也是01背包都是比较基础的题目
#include<bits/stdc++.h>
using namespace std;
int dp[30][1010];
int nums[30];
int main(){
int n, t;
cin >> n >> t;
for (int i = 1; i <= n; i++){
cin >> nums[i];
dp[i][0] = 1;
}
dp[0][0] = 1;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= t; j++){
if (j >= nums[i]){
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
}else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout << dp[n][t];
return 0;
}
洛谷-P1616
//完全背包问题
#include<iostream>
#include<algorithm>
using namespace std;
int t, m;
const int M = 1e4 + 10, T = 1e7 + 10;
long long dp[T], values[M], times[M];
int main(){
cin >> t >> m;
for (int i = 1; i < m + 1; i++) {
cin >> times[i] >> values[i];
}
for (int i = 1; i < m + 1; i ++){
for (int j = times[i]; j < t + 1; j++){
dp[j] = max(dp[j], dp[j - times[i]] + values[i]);
}
}
cout << dp[t];
return 0;
}