题解 P6394 【樱花,还有你】
porblem
P6394
与摆花很相似。(其实就是摆花加强版)
大意:
有
此题
细读题目,这不就是一道多重背包吗?此时我们将背包容量看成樱花数,那么 那么就可以直接做了。
for(i=1;i<=k;i++)//前i棵树
for(p=n;p>=0;p--)//多重背包转换为01背包
for(j=1;j<=min(s[i],p);j++)
f[p]=(f[p]+f[p-j])%10086001;
然而此时看一眼数据
最后附上
#include<iostream>
#include<cstdio>
using namespace std;
const int M=10086001;
int f[5001];
long long s[5001];//前缀和
int num,ans;
int main()
{
int n,t,i,j,p,k;
cin>>n>>k;
s[0]=f[0]=1;
for(i=1;i<=k;i++)
{
cin>>t;
for(j=1;j<=n;j++)//更新前缀和
s[j]=s[j-1]+f[j];
for(p=n;p>=0;p--)//多重背包
f[p]=(f[p]+s[p-1]-s[p-min(t,p)-1])%M;//利用前缀和
num+=t;//判断是否有解
ans=(ans+f[n])%M;//累加第i棵树下收集n朵花的方案
}
if(num<n)
cout<<"impossible";
else
cout<<ans;
return 0;
}