zoukankan      html  css  js  c++  java
  • 7.9 动态规划——摆花

    题目描述

    小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i 种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
    试编程计算,一共有多少种不同的摆花方案。

    输入

    每组输入数据的第一行包含两个正整数n和m,中间用一个空格隔开。
    第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1、a2、...an


    数据规模:
    对于20%数据,有0<n≤8,0<m≤8,0≤ai≤8;
    对于50%数据,有0<n≤20,0<m≤20,0≤ai≤20;
    对于100%数据,有0<n≤100,0<m≤100,0≤ai≤100。

    输出

    每组输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。


    下面是对样例数据的解释:
    有2种摆花的方案,分别是(1,1,1,2),(1,1,2,2)。括号里的1和2表示两种花,比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。

    样例输入

    2 4
    3 2

    样例输出

    2

    题解代码:
    #include<iostream>
    #include<string>
    #define mod 1000007
    using namespace std;
    int n,a[101],m,dp[101][101];   //dp[i][j]指的是摆i种花共j盆的最优解
    int main(){
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++){
      scanf("%d",&a[i]);
     }
     for(int i=0;i<=n;i++){
      dp[i][0]=1;//j为0时,无论i为多少种花,均为1
      
     }
     for(int i=1;i<=n;i++){
      for(int j=0;j<=a[i];j++){
       for(int k=0;k<=m-j;k++){
        if(j==0&&k==0) continue;
        dp[i][j+k]+=dp[i-1][k];
        dp[i][j+k]%=mod;
       }
      }
     }
     printf("%d\n",dp[n][m]);
     return 0;
    }
    题解:
    这道题的思路就是在第i盆花摆j盆的情况下,依次枚举第i-1盆花枚举摆放k盆的情况,k为从0到m-j,(因为已经摆放了j盆,所以枚举从0到m-j的情况),
    每次枚举,令dp[i][j+k]加上dp[i-1][k],(注意,j==0时而且k==0应跳过,因为无论i为多少,dp[i][0]只能为1),最终相加结果即为dp[n][m].
  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11156233.html
Copyright © 2011-2022 走看看