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];
}
};
京公网安备 11010502036488号