• 题意
    • n个程序员,一行代码产生a个bug
    • m行程序,要求bug总数<=b
    • 求所有的可行方案
  • 题解
    • 声明一个二维数组,记录多少程序员参与写代码,有多少bug数量,最多的有多少种情况。且当前人数写了代码的bug数量,是前面人数写的bug数加上当前人数写的bug的数量。
    • 于是又状态转移方程 dp[j][k]+=dp[j-1][k-a[i]]
    • 0个人写代码有有0个bug情况只有一种,所以dp[0][0]=1
  • 代码
    • #include<iostream>
      #include<cstdio>
      #include<cstring>
      #include<algorithm>
      #include<string>
      #include<vector>
      #include <ctime>
      #include<queue>
      #include<set>
      #include<map>
      #include<stack>
      #include<iomanip>
      #include<cmath>
      #define mst(ss,b) memset((ss),(b),sizeof(ss))
      #define maxn 0x3f3f3f3f
      #define MAX 1000100
      
      typedef long long ll;
      typedef unsigned long long ull;
      #define INF 0x3f3f3f3f
      using namespace std;
      int n,m,b,mod;
      ll dp[550][550];/// 前i行出现j个bug
      int a[550];
      int main(){
          scanf("%d%d%d%d",&n,&m,&b,&mod);
          for(int i=1;i<=n;i++) scanf("%d",&a[i]);
          dp[0][0]=1;
          for(int i=1;i<=n;i++){
              for(int j=1;j<=m;j++){
                  for(int k=a[i];k<=b;k++){
                      dp[j][k]=(dp[j][k]+dp[j-1][k-a[i]])%mod;
                  }
              }
          }
          ll ans=0;
          for(int i=0;i<=b;i++) {
              ans=(ans+dp[m][i])%mod;
          }
          cout<<ans<<endl;
          return 0;
      }

发表评论

邮箱地址不会被公开。 必填项已用*标注