题目概述
有
n
个英雄,每个英雄有
解题报告
双倍经验题:LOJ2256。
初始想法是直接定义
f[i][j]
表示前
i
个英雄方案总数为
空间炸了啊,但显然不会每个 j 都存在。来,我们随便搞个unordered_map(dalao也可以自己写啊QAQ)存第二个状态试试看吧。
然后你就过了?WTF?不如膜拜LargestJN!
不过……由于
定义
f[i][j]
表示前
i
个英雄方案价格为
然后用long double存(有效数字和long long一样),就变成裸背包了……出题人一定是没有想到这一点……
示例程序
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long double DB;typedef long long LL;
const int maxn=121,maxv=121*10*199;
int n,V,ti[maxn+5],w[maxn+5],ans;LL M;
DB f[maxv+5];
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d%lld",&n,&M);
for (int i=1;i<=n;i++) scanf("%d",&ti[i]);
for (int i=1;i<=n;i++) scanf("%d",&w[i]),V+=ti[i]*w[i];
f[0]=1;
for (int i=1;i<=n;i++)
for (int j=V;j;j--)
for (int k=1;k<=ti[i];k++) if (j>=k*w[i])
f[j]=max(f[j],f[j-k*w[i]]*k);
ans=0;while (f[ans]<M) ans++;
return printf("%d\n",ans),0;
}