传送门
我感觉自己好傻…
假如没有交换机会的话,直接做完全背包就好了
现在有了交换机会,我们不如贪心的让
最小的抵抗搭配上最大的魔力价值
然后剩下 k − 1 k-1 k−1次机会怎么办??你傻啊,现在我们最小的代价有了最大的价值
其他物品什么鬼样子需要管吗??随便把 k − 1 k-1 k−1次机会换换就好了
其他物品一定是两个属性都不如这个物品优秀的!!
那么只需要特判 k = 0 k=0 k=0,此时做完全背包不能交换
特判 n = 2 n=2 n=2,因为此时换不换属性不是我们说了算的, k k k为奇数的话一定要换
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5+10;
int n,m,k,a[maxn],b[maxn],f[maxn];
signed main()
{
cin >> n >> m >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cin >> b[i];
if( k==0||n==2 )
{
if( (k&1) ) swap( b[1],b[2] );
for(int i=1;i<=n;i++)
for(int j=a[i];j<=m;j++)
f[j] = max( f[j],f[j-a[i]]+b[i] );
cout << f[m];
return 0;
}
int mx = 0,mi = 1e18;
for(int i=1;i<=n;i++)
{
mi = min( mi,a[i] );
mx = max( mx,b[i] );
}
cout << m/mi*mx;
}