joshua分享:dp[i][j] 表示裁剪长度为i,宽度为j的布料最大所裁剪的衣服数量

牛妹做衣服

http://www.nowcoder.com/questionTerminal/9053c1dc96e5480e8a4d2a63e34c45d0

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];
    }
};
全部评论

相关推荐

菜鸡29号:根据已有信息能初步得出以下几点: 1、硕士排了大本和大专 2、要求会多语言要么是招人很挑剔要么就是干的活杂 3、给出校招薪资范围过于巨大,说明里面的薪资制度(包括涨薪)可能有大坑
点赞 评论 收藏
分享
Cassifa:发的字比你都多的一律视为骗子或者想白嫖压榨实习生的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务