1 条题解

  • 0
    @ 2025-10-5 19:47:03

    一道新学dp的同学可以做的题目。

    注意到每一次摆花都会用到之前摆的花的方案数,可以确定这是一道动态规划的题目。

    建立dp数组,用i种花可以摆j盆,得到数组dp[i][j],每一次摆花时,用一种新花可以有多种不同的总盆数,所以采用累加确定每一个点的方案数。

    套用模版: 1 初始化:dp[0][0]=1;不用花摆0盆一共有一种。 2 递推:对于每一个点,假设当前的新花要摆k盆,则递推公式为dp[i][j]=dp[i-1][j-k] 3 输出:输出dp[n][m]

    以及记得每次取模,相加total的值。

    #include <iostream> 
    #include <vector> 
    #include <algorithm> 
    
    using namespace std; 
    	
    int main() { 
    	int n,m;cin>>n>>m;
    	vector<int> a(n);
    	for(int i=0;i<n;i++){
    		cin>>a[i];
    	}
    	vector<vector<int>> dp(n+1,vector<int>(m+1));
    	dp[0][0]=1;
    	for(int i=1;i<=n;i++){
    		int max=a[i-1];
    		int zong;
    		for(int j=0;j<=m;j++){
    			zong=0;
    			for(int k=0;k<=max&&k<=j;k++){
    				zong+=dp[i-1][j-k];
    			}
    			zong%=1000007;
    			dp[i][j]=zong;
    		}
    	} 
    	printf("%d",dp[n][m]%1000007);
    	return 0; 
    }
    
    • 1

    信息

    ID
    394
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    319
    已通过
    200
    上传者