https://leetcode.cn/problems/maximum-value-of-k-coins-from-piles/submissions/581117938/
这是一个分组背包的题,每一栋的硬币只能从上到下取,没取完上面无法取下面的,那可以这样想,对于每一栋代表每一组,这一组内前i个物品的代价是i(i个硬币),价值是前i个硬币的总价值和,组内的物品只能取一次(总不能我在一栋硬币内取完前三个再取前5个把,这样就重复)所以就是分组背包板题,以后想背包分组可以这么去思考
int dp[1010][2010];
int a[1010][2010];
int b[1010][2020];
class Solution {
public:
int maxValueOfCoins(vector<vector<int>>& piles, int k) {
//memset(dp,0,sizeof(dp));
//memset(a,0,sizeof(a));
//memset(b,0,sizeof(b));
int n=piles.size();
for(int i=1;i<=n;i++)
for(int j=1;j<=piles[i-1].size();j++)
a[i][j]=piles[i-1][j-1];
for(int i=1;i<=n;i++)
for(int j=1;j<=piles[i-1].size();j++)
b[i][j]=b[i][j-1]+a[i][j];
for(int i=1;i<=n;i++)
{
for(int j=k;j>=0;j--)
{
dp[i][j]=dp[i-1][j];
for(int k=1;k<=piles[i-1].size();k++)
{
if(j>=k) dp[i][j]=max(dp[i][j],dp[i-1][j-k]+b[i][k]);
}
}
}
return dp[n][k];
}
};