二维完全背包
套用完全背包的想法:
外层循环是体积,内层循环是种类
无非就是外面再加一层而已
也没办法状态压缩,因为不知道%多少
class Solution {
public:
/**
*
* @param L int整型 给定布料的长
* @param W int整型 给定布料的宽
* @param clothSize int整型vector<vector<>> 每件衣服所需的尺寸
* @return int整型
*/
int max(int a,int b,int c)
{
if(a>b)
{
if(c>a) return c;
return a;
}
if(c>b) return c;
return b;
}
int clothNumber(int L, int W, vector<vector<int> >& clothSize) {
// write code here
int dp[1005][1005];
int n = clothSize.size();
if (n == 0) return 0;
memset(dp,0,sizeof(dp));
for(int i=0;i<=L;i++)
{//类似于背包问题中枚举容量的状态
for(int j=0;j<=W;j++)
{
for(int k=0;k<n;k++)
{//类似于背包问题终枚举物品的状态
if(i >= clothSize[k][0] && j >= clothSize[k][1])
{//(1)图片解释
dp[i][j] = max(dp[i][j],
dp[i - clothSize[k][0]][j] + dp[clothSize[k][0]][j - clothSize[k][1]] + 1,
dp[i][j - clothSize[k][1]] + dp[i - clothSize[k][0]][clothSize[k][1]] + 1);
}
if(i >= clothSize[k][1] && j >= clothSize[k][0])
{//(2)图片解释
dp[i][j] = max(dp[i][j],
dp[i - clothSize[k][1]][j] + dp[clothSize[k][1]][j - clothSize[k][0]] + 1,
dp[i][j - clothSize[k][0]] + dp[i - clothSize[k][1]][clothSize[k][0]] + 1);
}
}
}
}
return dp[L][W];
}
};(1)图片解释
(2)图片解释
分别按着这两种虚线裁剪布料的转移方程
贪心应该做不了,首先如果用面积贪心,肯定行不通。因为裁剪我需要知道具体裁剪的长和宽, 以及裁剪时长和宽的方向。光用贪心,不能够穷举所有的状态。

京公网安备 11010502036488号