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];
    }
};