求助代码差异
  • 板块学术版
  • 楼主Super_Supper
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/10/18 15:47
  • 上次更新2023/10/27 07:01:20
查看原帖
求助代码差异
488827
Super_Supper楼主2022/10/18 15:47
#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;
}

究竟哪里不用呢

2022/10/18 15:47
加载中...