1. 摆花
题解:
说实话,我觉得这题题意不够明确,导致有些人一个测试点也过不去,坑啊。
做这题有个要注意的地方,就是并不要求每种花都要有!!
Solution 1
搜索:
只要注意到上面说的即可
不过只能拿到30分
附代码:
#include<stdio.h>
#define MAXN 100
int n,m,ans;
int a[MAXN];
void dfs(int k,int v)
{
//if (v==0) return ;
if (k==n-1)
{
if (v<=a[k])
//printf(" %d\n",v);
ans=(ans+1)%1000007;
}
else
for (int i=0;i<=a[k];++i)
if (v-i>=0)
{
// printf("%d ",i);
dfs(k+1,v-i);
}
}
int main()
{
scanf("%d %d",&n,&m);
for (int i=0;i<n;++i) scanf("%d",&a[i]);
dfs(0,m);
printf("%d\n",ans);
// while (1);
return 0;
}
Solution 2
Dp
网上很多人都说是背包类dp
但我是从整数划分出发推出dp方程的,幸亏数据小,能够ac
设F[i,j]表示数j划分成i个数的可能方案数,则状态转移方程为
注意这里划分成的数可以为0!
F[i,j]=Sum(f[i-1,j-x])
(0<=x<=min(a[i],j))
附代码:
f[0][0]=1;
for (i=1;i<=n;++i)
for (j=0;j<=m;++i)
{
l=a[i]>j?j:a[i];
for (k=0;k<=l;++k)
f[i][j]=f[i-1][j-k];
}