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

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;
}

 


标签:摆花,NOIP2012,int,1000007,namespace,maxn,P1077,include,mod
来源: https://www.cnblogs.com/2elaina/p/16518139.html