洛谷P1049装箱问题
cpp
#include<iostream>
using namespace std;
int m, n;
const int N = 20005;
int v[35];
int dp[35][N];//装i个物品空间为j的盒子剩余空间最小的值
int main(){
cin >> m >> n;
for(int i = 1; i <= n; i++){
cin >> v[i];
}
for(int i = 0; i < N; i++)dp[0][i] = i;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
if(j < v[i])dp[i][j] = dp[i - 1][j];//不够空间只能不装
else dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - v[i]]);//空间够了可装可不装(找小的)
}
}
cout << dp[n][m] << endl;
return 0;
}
洛谷P1060开心的金明
cpp
#include<iostream>
using namespace std;
int n, m;
const int N = 30005, M = 30;
int v[M], w[M];
int dp[N];//dp[i][j]表示不超过j元的前i物品价格*重要度的最大值
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> v[i] >> w[i];
}
for(int i = 1; i <= m; i++){
for(int j = n; j >= v[i]; j--){
dp[j] = max(dp[j], dp[j - v[i]] + v[i] * w[i]);
}
}
cout << dp[n] << endl;
return 0;
}
洛谷P3985不开心的金明
cpp
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 110, M = 1e8;
int v[N], w[N], maxx, minn = 0x3f3f3f3f;
long long dp[M];
bool cmp(int a, int b){
return a > b;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> v[i] >> w[i];
maxx = max(maxx, v[i]);
minn = min(minn, v[i]);
}
if(minn <= 300){
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
}
}
cout << dp[m] << endl;
}
else{
int ans = 0;
sort(w + 1, w + n + 1, cmp);
for(int i = 1; i <= m / minn; i++){
ans += w[i];
}
cout << ans << endl;
}
return 0;
}
洛谷P2722总分 Score Inflation
cpp
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 10010;
int mark[N], t[N];
long long dp[N];
int main(){
cin >> m >> n;
for(int i = 1; i <= n; i++){
cin >> mark[i] >> t[i];
}
dp[0] = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(t[i] <= j)dp[j] = max(dp[j], dp[j - t[i]] + mark[i]);
}
}
cout << dp[m] << endl;
return 0;
}