zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ubuntu下内核源码树的建立
    删除ubuntu旧版本内核
    设置ubuntu12.04桌面版开机进入命令行模式
    MFC学习笔记(一)向模态对话框传递数据
    redis 映射数据结构粗略
    redis入门
    mybatis总结
    mybatis--mapper配置总结
    mybatis-初步使用
    maven-plugins说明
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11049353.html
Copyright © 2011-2022 走看看