noip2012摆花

1.      摆花

https://www.vijos.org/p/1792 

题解:

说实话,我觉得这题题意不够明确,导致有些人一个测试点也过不去,坑啊。 

做这题有个要注意的地方,就是并不要求每种花都要有!!


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];
		}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值