#include <cmath>
#include <iostream>
using namespace std;
using ll = long long;
constexpr int N = 505;
ll n, k, ans = 1e18, w[N], v[N], dp[2][N * N];
int main() {
// freopen("young.in", "r", stdin);
// freopen("young.out", "w", stdout);
fill(dp[0], dp[1] + (N * N), 1e18);
cin >> n;
for (int i = 1; i <= n; i++) {
double x;
cin >> v[i] >> w[i] >> x;
v[i] *= round(100 - x * 100); // 处理学分
}
cin >> k;
k *= 100;
int o = 0;
dp[0][0] = dp[1][0] = 0;
for (int i = 1; i <= n; i++, o ^= 1) {
for (int j = v[i]; j < N * N; j++) {
dp[o][j] = min(dp[o ^ 1][j - v[i]] + w[i], dp[o ^ 1][j]); // 滚动数组 & 状态转移
}
}
for (int i = k; i < N * N; i++) {
ans = min(ans, dp[o ^ 1][i]); // 处理答案
}
cout << ans;
return 0;
}
/*
i, j 表示选到第 i 门课
状态转移方程:
i, j = min((i - 1, j - v[i]), (i - 1, j))
*/
和
#include <cmath>
#include <iostream>
using namespace std;
using ll = long long;
const int N = 505;
double p;
int w[N], v[N];
ll dp[N * N], sum, ans = 1e18;
int n, minX, maxW;
int main () {
// freopen("young.in", "r", stdin);
// freopen("young.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> w[i] >> v[i] >> p;
w[i] *= round (100 - p * 100);
maxW += w[i];
cout << i << ':' << w[i] << '\n';
}
cin >> minX; minX *= 100;
fill (dp + 1, dp + 1 + maxW, 1e18);
for (int i = 1; i <= n; i++) {
sum += w[i];
for (int j = sum; j >= w[i]; j--) {
dp[j] = min (dp[j], dp[j - w[i]] + v[i]);
}
}
for (int i = minX; i <= sum; i++) {
ans = min (ans, dp[i]);
}
cout << ans;
return 0;
}
究竟哪里不用呢