P1077 [NOIP2012 普及组] 摆花

https://www.luogu.com.cn/problem/P1077
涉及知识点:模拟,动态规划DP
黄色题
 
思路:
状态定义: 用f[i][j]表示前i种花,目前摆放了j盆的方案数
那么f[i][j]=f[i-1][j-0]+f[i-1][j-1]+f[i-1][j-2]+f[i-1][j-3]+f[i-1][j-min(a[i],j)];  //当k=0时也算上了 f[i-1][j]的情况,也就是选的情况
边界条件: f[0][0]=1; 无论有多少种花,一盆也不用放的话也算一种方案
动态转移方程: f[i][j]+=f[i-1][j-k];    //f[i-1][j-k]表示不选这k盆花的情况
 
代码:
复制代码
#include<bits/stdc++.h> using namespace std; const int maxn=105, mod = 1000007; int n, m, a[maxn], f[maxn][maxn]; 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++) 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]<<endl; return 0; }
复制代码

方法二:背包

复制代码
#include<bits/stdc++.h> using namespace std; const int maxn=105, mod = 1000007; int n, m, a[maxn], f[maxn]; int main() { cin>>n>>m; for(int i=1; i<=n; i++) cin>>a[i]; f[0] = 1; for(int i=1; i<=n; i++) for(int j=m; j>=0; j--) //注意,是01背包 for(int k=1; k<=min(a[i], j); k++) f[j] = (f[j] + f[j-k])%mod; cout<<f[m]<<endl; return 0; }
复制代码

 



__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16518139.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示