P1077 摆花

P1077 摆花

题解

 实际上,这是一个背包问题

分组背包 + 背包方案数

 

这道题的费用在哪里鸭??

 隐含在题目里:摆花总盆数不超过 m 

也就是花拥有了 ‘ 盆数 ’ 费用

 

为什么是分组背包??

因为一种花最多可以摆 ai 盆,相同花色的花摆在一起,花没有编号,摆哪一盆都是一样的

所以对于同一种花,摆0盆就是一个亚子,摆1盆就是另一种亚子,摆2盆还是一种亚子... 但是这些亚子都是相互冲突的啊,摆了一盆就不能摆两盆了(显然

 

背包方案数??

自然是方案数的累加了

 

注意:

f [m] 为摆 m 盆花的最大方案数

边界:f [0] =1

转移方程:f [ j ]=( f[ j ] +f[ j - .. ] )

 

代码

#include<bits/stdc++.h>

using namespace std;

const int mod=1e6+7;

int n,m,ans=0;
int a[105],w[105][105];
long long f[105];  //开小的话会炸 

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }

    memset(f,0,sizeof(f));
    f[0]=1;    //处理边界:摆0盆花有一种方案 
      
    for(int i=1;i<=n;i++)
      for(int j=m;j>=0;j--)
        for(int k=1;k<=a[i];k++)   
        //分组,第i组中的每一种情况,k要从1开始枚举啊
        //要是从0开始的话,那么一开始f[j]就翻倍了 
        {
            f[j]=(f[j]%mod+f[j-k]%mod)%mod;
        }
           
    cout<<f[m]%mod;
    
    return 0;
}

 

 

 

困惑

细心的小可爱会发现代码里面那个 w 二维数组定义了以后就再也没有提及它了

提交代码的时候不加会WA,加了就AC没事了,可能是RP问题吧QAQ

之前也遇到过这种情况QAQ

 

解释一下w是干啥的:(不想看的可以走了)

一开始构建代码的时候,想着既然是分组背包,就开个数组记录一下每一组的情况吧

w[i][j]表示第 i 种花摆 j 盆的 ‘ 件数 ’ 费用,后来发现可以不用,直接用 k 代替就好了(没错,就是第三重for循环的那个k)

但是现在它没用了QAQ

 

posted @ 2019-06-19 09:23  晔子  阅读(172)  评论(0编辑  收藏  举报