题目:
某公司团建郊游,男女生一共有T个人,其中X个为男生, Y个为女生,再其中,有v对异性情侣,到宿营地后,开始分配帐篷。
帐蓬有三种,三人帐篷,普通双人帐篷和爱心帐篷。
注意,普通帐篷双人和三人帐蓬都只能住相同性别的人,而爱心帐篷可以住一对异性情侣。但是,普通帐篷和三人帐篷的实际入住人数量可以小于其上限,而爱心帐篷则不行。
帐蓬价格:三人帐篷p1元/顶,普通双人帐蓬p2元/顶,爱心帐篷p3元/顶
要求总价最少即可。注:三人帐篷不一定比两人帐篷便宜。情侣可以拆开睡。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int p1, p2, p3;
int x, y, v;
cout << "输入男生人数:";
cin >> x;
cout << "输入女生人数:";
cin >> y;
cout << "输入情侣人数:";
cin >> v;
cout << "输入三人帐篷的单价:";
cin >> p1;
cout << "输入普通两人帐篷的单价:";
cin >> p2;
cout << "输入爱心帐篷的单价:";
cin >> p3;
//定义两个数组分别存男生的方案和女生的方案
int arr1[100][3], arr2[100][3];
int cnt1 = 0, cnt2 = 0;
int men = x, women = y;
//根据情侣的数量来枚举所有的情况
for (int i = 0; i <= v; i++)
{
//减去混合的男女方便分类
//每次要重新赋值,在循环中x y 数量会变
x = men;
y = women;
//减去情侣的数量
x -= i;
y -= i;
//男生三人帐篷
int m1, m2;
//考虑取余的情况,住不满
if (x % 3 == 0) m1 = x / 3; else m1 = x / 3 + 1;
//同样的问题 ,每次数量都会变
int tmp = x;
//枚举双人帐篷的数量
for (int j = 0; j <= m1; j++)
{
x = tmp;
//减去住三人帐篷的人
x -= j * 3;
//剩下的都是猪双人帐篷的,同样考虑住不满取余的情况
if (x % 2 == 0) m2 = x / 2; else m2 = x / 2 + 1;
//如果男的数量在减去三人帐篷的数量乘3的小于0的话,说明存在三人帐篷住不满的情况,这样就没有人住双人帐篷了
if (x < 0) m2 = 0;
//将结果存在数组里面
arr1[cnt1][0] = j; arr1[cnt1][1] = m2; arr1[cnt1][2] = i;
cnt1++;
}
//女生同理
int w1, w2;
if (y % 3 == 0) w1 = y / 3; else w1 = y / 3 + 1;
tmp = y;
for (int j = 0; j <= w1; j++)
{
y = tmp;
y -= j * 3;
if (y % 2 == 0) w2 = y / 2; else w2 = y / 2 + 1;
if (y < 0) w2 = 0;
arr2[cnt2][0] = j; arr2[cnt2][1] = w2; arr2[cnt2][2] = i;
cnt2++;
}
}
int price = 1000000, a=0, b=0, c=0;
//加入 能让男生住满的方案m种, 女生n种,总的条件一个有 m * n种
for (int i = 0; i < cnt1; i++)
{
for (int j = 0; j < cnt2; j++)
{
//但是应该注意一个条件 男女生两种方案中的情侣帐篷数量应该相等 才符合要求
if (arr1[i][2] == arr2[j][2])
{
int temp = (arr1[i][0] + arr2[j][0]) * p1 + (arr1[i][1] + arr2[j][1]) * p2 + arr1[i][2] * p3;
// 打印出所有的搭配
// cout << "三人:" << arr1[i][0] + arr2[j][0] << " 双人:" << arr1[i][1] + arr2[j][1] << " 爱心:" << arr1[i][2]<< " 价格:" << temp << endl;;
//每次都和之前的价格比较
// price = min(price, temp);
if (temp < price)
{
price = temp;
a = arr1[i][0] + arr2[j][0]; b = arr1[i][1] + arr2[j][1]; c = arr1[i][2];
}
}
}
}
cout << "三人:" << a << " 双人:" << b << " 爱心:" << c << " 价格:" << price << endl;
return 0;
}