算法1
这题数据范围较小,n最大只有50,可以尝试爆搜,加上剪枝就能过。
每次贿赂的金币最多只有2个,所以最多不会超过100枚金币,
但是怪兽的武力值很大,得开long long
C++ 代码
#include <iostream>
using namespace std;
const int N = 55;
using LL = long long;
LL a[N];
int c[N];
int n, ret = 110;
void dfs(int idx, LL sum, int pay){
if(pay >= ret) return; // 最优性剪枝
if(idx == n - 1){
if(sum < a[idx]) pay += c[idx];
ret = min(ret, pay);
return;
}
// 打不过就必须贿赂, 打得过可以贿赂, 也可以不鸟它
dfs(idx + 1, sum + a[idx], pay + c[idx]);
if(sum >= a[idx])
{
dfs(idx + 1, sum, pay);
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; ++ i) cin >> a[i]; // 武力值
for(int i = 0; i < n; ++ i) cin >> c[i]; // 贿赂所需金币值
dfs(0, 0, 0); // 爆搜
cout << ret << endl;
return 0;
}