链接:https://ac.nowcoder.com/acm/contest/9986/G
来源:牛客网
注意在数据范围小的时候,考虑状压DP,和注意可以从两个元素入手推导多个元素
有 n 个机器人,每个机器人会读入一个 x ,并返回 ax+b 。
现在银临姐姐手里有一个数 x ,她想将机器人按某种顺序排列,使得最终返回得到的 x 尽可能大。
解法一:对于任意两个函数,A在内或者B在内,推导出公式,排序
bool cmp(node a,node b){
return a.b * b.a + b.b > a.a * b.b + a.b;
}
int main()
{
__int128 n,x,ans;
ans = 0;
n = read();x = read();
__int128 sum = 1;
for(int i = 1;i <= n;i ++){
Node[i].a = read();Node[i].b = read();
}
sort(Node + 1,Node + 1 + n,cmp);
for(int i = 1;i <= n;i ++){
x = Node[i].a * x + Node[i].b;
}
write(x);
return 0;
}
解法二:状压DP
```cpp
dp[0] = x;
for(ll i = 0;i <= (1 << n) - 1;i ++){
for(int j = 1;j <= n;j ++){
__int128 x = (1 << (j - 1));
if(i & x) continue;
dp[i ^ x] = max(dp[i ^ x],dp[i] * Node[j].a + Node[j].b );
}
}
write(dp[(1 << n) - 1]);