leetcode 盈利计划_编程题目
思路:
dp[i][j]代表不超过i 至少j的方案数,然后就很好转移了,第二维可以是负数,但是负数可以当作0处理。

const int N=110;
const int M=10010;
const int mod=1e9+7;
int dp[N][N];//最多用了i个人,利润不超过j的方案数
class Solution {
public:
    
    //dp[n][m]
    int profitableSchemes(int n, int m, vector<int>& group, vector<int>& profit) {
            memset(dp,0,sizeof dp);
            for(int i=0;i<=n;i++)
            dp[i][0]=1;
            for(int i=1;i<=group.size();i++)
            {
                int g=group[i-1];
                int pro=profit[i-1];
                for(int j=n;j>=g;j--)
                    for(int k=m;k>=0;k--)
                    {
                        dp[j][k]=(dp[j][k]+dp[j-g][max(0,k-pro)])%mod;
                    }
            }
            return dp[n][m];
    }
};