首页 > 其他分享 >P1077 [NOIP2012 普及组] 摆花

P1077 [NOIP2012 普及组] 摆花

时间:2024-05-15 20:32:14浏览次数:11  
标签:摆花 NOIP2012 状态 int 方案 P1077

P1077 [NOIP2012 普及组] 摆花

题目描述

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

试编程计算,一共有多少种不同的摆花方案。

一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对 10^6+7 取模的结果。

样例输入
2 4
3 2
样例输出
2
动态规划
#include <bits/stdc++.h>
using namespace std;
const int N=105, mod=1e6+7;

int n,m;
int a[N];
int f[N][N];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
	 cin>>a[i]; 
	 
	f[0][0]=1; //什么都不选时一种方案 因此初始化为1
	for(int i = 1; i <= n; i++)
	for(int j = 0; j <= m; j++) 
	for(int k = 0; k <= min(j,a[i]); k++){
		f[i][j]=(f[i][j]+f[i-1][j-k]) % mod;
	}
	cout<<f[n][m];
	return 0;
}
 

所谓滚动数组就是 只保留两种状态 1.当前状态 2.前一种状态 当算完当前状态的时候 把它改为前一种状态
滚动数组
#include <bits/stdc++.h>
using namespace std;
const int N=105, mod=1e6+7;

int n,m,t;
int a[N];
int f[2][N];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}
	f[0][0]=1;   //一个都没选的也是一种方案 
	for(int i=1;i<=n;i++){
		
		t=1-t;   //实现滚动 t 一开始初始化为 0 通过赋值得 1 
		         
		for(int j=0;j<=m;j++){
			
			f[t][j]=0; //初始化  -- 改成下一个状态 
			
		   for(int k=0;k<=min(a[i],j);k++){
		   	f[t][j]=(f[t][j]+f[1-t][j-k])%mod;
		   } 
		}
	}
	cout<<f[t][m];
   return 0; 
}

标签:摆花,NOIP2012,状态,int,方案,P1077
From: https://www.cnblogs.com/ltphy-/p/18180354

相关文章

  • 「NOIP2012」同余方程 题解!!
    嗨嗨嗨!又是我想写这道题,我们就需要掌握:拓展欧几里得顾名思义,它就是欧几里得算法(人话:辗转相除法)的proMax版本别告诉我你不会辗转相除法拓展欧几里得的作用是求对于方程\[a*x+b*y=gcd(a,b)\]解出x,y的值。让我们一步步分析!贴个辗转相除板子先:voidojld(inta,intb){ i......
  • 洛谷题单指南-动态规划1-P1077 [NOIP2012 普及组] 摆花
    原题链接:https://www.luogu.com.cn/problem/P1077题意解读:n种花选m个的选法,每种花数量为ai。解题思路:设dp[i][j]表示前i种花选j个的选法对于第i种花,可以选0,1,2...min(ai,j)个则有递推式:dp[i][j]=∑dp[i-1][j-k],k取0,1,2...min(ai,j)初始化dp[0][0]=1100分代码:#incl......
  • P1077 [NOIP2012 普及组] 摆花
    题目:链接:https://www.luogu.com.cn/problem/P1077总的来说就是和上题差不多?记dp[i][j]为前i种花塞进了j的背包的种类,那么状态转移方程:就是:dp[i][j]=dp[i-1][j]+dp[i-1]j-k贴代码:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<ss......
  • 蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)
    目录 一、摆花思路一: 确定状态:初始化:思路二:确定状态:初始化:循环遍历: 状态转移方程: 二、数字三角形加强版一、摆花题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了......
  • P1075 [NOIP2012 普及组] 质因数分解
    P1075[NOIP2012普及组]质因数分解[NOIP2012普及组]质因数分解题目描述已知正整数\(n\)是两个不同的质数的乘积,试求出两者中较大的那个质数。输入格式输入一个正整数\(n\)。输出格式输出一个正整数\(p\),即较大的那个质数。样例#1样例输入#121样例输出#1......
  • P1083 [NOIP2012 提高组] 借教室
    题目链接:本题由于是对某一段区间的数统一进行删除某个数的操作,很容易想到差分。对于能否二分,有一个界定标准:状态的决策过程或者序列是否满足单调性或者可以局部舍弃性。在本题中,由于随着订单数量的增加,每天可用教室的数量一定单调下降。也即,如果前一份订单都不满足,那么之后的所......
  • 洛谷题单指南-贪心-P1080 [NOIP2012 提高组] 国王游戏
    原题链接:https://www.luogu.com.cn/problem/P1080题意解读:通过不同的排队方式,让获得最多奖赏的大臣金额尽可能的少。此题如果没有思路,用全排列枚举可以“骗”分,更好的做法直觉上是某种贪心策略,另外基于数据规模考虑,要拿满分,需要上高精度。下面就由浅入深一步一步的解决。解题思......
  • P1082 [NOIP2012 提高组] 同余方程
    原题链接扩展欧几里得算法的应用,关于原理性的讲解这里就略去了,这边给出学习链接即模板。intexgcd(inta,intb,int&x,int&y){if(b==0){x=1;y=0;returnx;}intd=exgcd(b,a%b,x,y);x=y;y=d-a/b*y;returnx;}文......
  • [NOIP2012 提高组] 借教室
    原题链接一道二分+差分的题目,作为学习前缀和和差分的引入题目非常合适。首先检验其单调性,如果一个申请人订单不用修改,那么其前面的申请人也不用修改,符合单调性。接着,这道题暴力的思路就很简单,但是看到运算量(n,m高达1e6),暴力的时间复杂度为O(n*m)显然超时。那么就是运用差分思想......
  • 动态规划--摆花(二维dp)
    #include<iostream>usingnamespacestd;//dp[i][j]表示第i种花位置,第j个位置为止longlongintdp[120][120];longlonginta[160];intmain(){intn,m;cin>>n>>m;//n种花m盆for(inti=1;i<=n;i++){cin>>a[i];}dp[0][0]=1;for(inti=1;i<=n;......