本文主要是介绍【CSUST 7041】: 修机器 DP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
传送门
题意
分析
很容易写出状态转移方程
f [ j ] = m a x ( f [ j ] , f [ j − y ] + ( t − j ) ∗ x ) ; f[j] = max(f[j],f[j - y] + (t - j) * x); f[j]=max(f[j],f[j−y]+(t−j)∗x);
似乎是一个背包问题
但是需要考虑的是,背包是不用考虑顺序问题的,这里需要考虑一下顺序问题
所以按照比例 s o r t sort sort一下再去背包
代码
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
const ll mod = 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a) {char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
int gcd(int a, int b) {return (b > 0) ? gcd(b, a % b) : a;}
int n,t;
ll f[N];
struct Node{ll x,y;
}a[N];bool cmp(Node A,Node B){return A.x * 1.0 / ( A.y * 1.0) > B.x * 1.0 / (B.y * 1.0);
}int main() {read(n),read(t);ll ans = 0;for(int i = 1;i <= n;i++){read(a[i].x),read(a[i].y);}sort(a + 1,a + 1 + n,cmp);for(int i = 1;i <= n;i++){ll x,y;x = a[i].x,y = a[i].y;for(int j = t;j >= y;j--){f[j] = max(f[j],f[j - y] + (t - j) * x);ans = max(ans,f[j]);}}dl(ans);return 0;
}
这篇关于【CSUST 7041】: 修机器 DP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!