33,008
社区成员
发帖
与我相关
我的任务
分享
double material = 6.3;
double size[3] = {0.5, 1, 2};
pair<int, double> dp[100][100][100];
pair<int, double> get(pair<int, double>& p, int id)
{
if (size[id] > p.second)
return (make_pair(p.first+1, material - size[id]));
return (make_pair(p.first, p.second - size[id]));
}
pair<int, double> minp(pair<int, double>& p1, pair<int, double>& p2)
{
if (p1.first < p2.first) return p1;
if (p1.first == p2.first)
{
if (p1.second > p2.second) return p1;
}
return p2;
}
pair<int, double> go(int n1, int n2, int n3)
{
if (dp[n1][n2][n3].first != -1) return dp[n1][n2][n3];
pair<int, double> p1, np1, p2, np2, p3, np3;
np1.first = np2.first = np3.first = INT_MAX;
if (n1 > 0)
{
p1 = go(n1-1, n2, n3);
np1 = get(p1, 0);
}
if (n2 > 0)
{
p2 = go(n1, n2-1, n3);
np2 = get(p2, 1);
}
if (n3 > 0)
{
p3 = go(n1, n2, n3-1);
np3 = get(p3, 2);
}
pair<int, double> min0 = minp(minp(np1, np2), np3);
dp[n1][n2][n3] = min0;
return min0;
}
void cal()
{
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 100; k++)
dp[i][j][k] = make_pair(-1, 0);
dp[0][0][0].first = 0;
dp[0][0][0].second = 0;
go(10, 20, 30);
cout << go(10, 20, 30).first << endl;
}
double size[3] = {0.5, 1, 2};
pair<int, double> dp[100][100][100];
double material = 6.3;
pair<int, double> get(pair<int, double>& p, int id)
{
if (size[id] > p.second)
return (make_pair(p.first+1, material - size[id]));
return (make_pair(p.first, p.second - size[id]));
}
pair<int, double> go(int n1, int n2, int n3)
{
if (dp[n1][n2][n3].first != -1) return dp[n1][n2][n3];
pair<int, double> p1, np1, p2, np2, p3, np3;
np1.first = np2.first = np3.first = INT_MAX;
if (n1 > 0)
{
p1 = go(n1-1, n2, n3);
np1 = get(p1, 0);
}
if (n2 > 0)
{
p2 = go(n1, n2-1, n3);
np2 = get(p2, 1);
}
if (n3 > 0)
{
p3 = go(n1, n2, n3-1);
np3 = get(p3, 2);
}
pair<int, double> minp = min(min(np1, np2), np3);
dp[n1][n2][n3] = minp;
return minp;
}
void cal()
{
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 100; k++)
dp[i][j][k] = make_pair(-1, 0);
dp[0][0][0].first = 0;
dp[0][0][0].second = 0;
go(10, 20, 30);
cout << dp[10][20][30].first << endl;
}