B、智乃买瓜
简单背包,简单来讲,这道题的题解就写在题面里边了。
1.购买一整个重量为的西瓜
2.把瓜劈开,购买半个重量为的西瓜
3.不进行购买操作
对应着DP转移的三个决策,不妨开一个的数组,示现在放到第个西瓜,且当前的重量为。
显然有DP转移方程:
注意当或者时这一项是没有的。
当然,实际处理的时候习惯将二维数组用滚动数组优化成一维。
时间复杂度,空间复杂度
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int n,m,x;
const long long mod=1e9+7;
long long dp[MAXN];
int main()
{
dp[0]=1;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
for(int i=m;i;--i)
{
if(i>=x/2)dp[i]+=dp[i-x/2];
if(i>=x)dp[i]+=dp[i-x];
while(dp[i]>=mod)dp[i]-=mod;
}
}
for(int i=1;i<=m;++i)
{
printf("%lld%c",dp[i]," \n"[i==m]);
}
return 0;
}