【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;
}
posted @ 2023-02-05 09:38  Syara  阅读(12)  评论(0编辑  收藏  举报