joshua分享:首先该类问题是典型的完全背包问题,现在考虑裁剪的时候,需要考虑对现有的布料进行横向裁剪还是是竖向裁剪,每一种裁剪方法都有两种分割方法,两种裁剪方法一共有四种状态,所以每一款衣服的每一种裁剪都有四种状态选择,然后遍历所有的款式就可以了
class Solution { public: /** * * @param L int整型 给定布料的长 * @param W int整型 给定布料的宽 * @param clothSize int整型vector<vector<>> 依次列举每件衣服所需的长和宽 * @return int整型 */ int clothNumber(int L, int W, vector<vector<int> >& clothSize) { vector<vector<int> > dp(L+1, vector<int>(W+1, 0)); for(int k = 0; k < clothSize.size(); k++) { int l = clothSize[k][0], w = clothSize[k][1]; // 完全背包 for(int i = 1; i <= L; i++) { for(int j = 1; j <= W; j++) { // 首先横向裁剪,剩下的布料有两种剪切方式 if(i >= l && j >= w) dp[i][j] = max(dp[i][j], max(dp[i-l][j] + dp[l][j-w] + 1, dp[i][j-w] + dp[i-l][w] + 1)); // 交换方向进行继续进行竖向裁剪 swap(l, w); if(i >= l && j >= w) dp[i][j] = max(dp[i][j], max(dp[i-l][j] + dp[l][j-w] + 1, dp[i][j-w] + dp[i-l][w] + 1)); } } } return dp[L][W]; } };