【ABC270D】Stones
首先很显然直接贪心是不行的,就好像背包的时候一直选价值最大的肯定会假一样。
诶?背包?这题还真有点像背包。
考虑像背包一样设,\(f_i\) 表示剩下 \(i\) 个石子的先手最大获得石头数。
设最后一步拿走了 \(m\) 颗石子,显然 \(m\in A\)。那么有 \(f_i=i-f_{i-m}\)(总共 \(i\) 个嘛,对手肯定也是按照这个最优方案搞的,那么拿走的就是是 \(f_{i-m}\))。
然后直接 \(O(NK)\) 就把这题冲过了。
#include <stdio.h>
int val[10005];
int f[10005];
inline int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int n,i,j,k;scanf("%d %d",&n,&k);
for(i=1;i<=k;++i)
{
scanf("%d",val+i);
}
for(i=1;i<=n;++i)
for(j=1;j<=k;++j)
if(i>=val[j])
f[i]=max(f[i],i-f[i-val[j]]);//这一坨真的很像背包诶。
//个人认为这题用到了背包的思想。
printf("%d",f[n]);
return 0;
}