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

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11049353.html
Copyright © 2011-2022 走看看