分礼物算法
① 动态规划分配礼物问题
思想:
1:对礼物的价值排序,采用快速排序,从价值大到小排序。
2:主体思想:
2.1初始化:把第一个礼物分给Alan, 第二个礼物分给Bob,并以a、b纪录2者的个人的总价值
2.2:循环以下动作,直到分配结束:
if a<=b,把下一个礼物分给Alan
else ,把下一个礼物分给Bob
复杂度:排序复杂度为O( n*logn ),核心算法复杂度:O( n ),所以总体复杂度为O( n*logn )。
思想:没有按照你要求的动态规划的思想方法,而是采用了贪心算法,貌似要比动规简便。
② 三个人同时分3种礼物几种分法
如果是保证每人1个话,一共有6种方法。
比如:有三个人分别是甲乙丙。三个礼物分别为ABC。
甲→A,乙丙分BC,有两种。
甲→B,乙丙分AC,有两种。
甲→C,乙丙分AB,有两种。
一共就是六种!
③ 有5个礼物,三个人全部分到有多少种分法
六种
(1,1,3)有三种,即每个人分到三代表一种,三个人共三种
(2,2,1)有三种,即每个人分到一代表一种,三个人共三种
故共六种
④ 把5件相同的礼物全部分给3个小朋友,使每个小朋友都分到礼物,分礼物的不同方法一共有几种(求过程)
先每人拿一件礼物,还剩两件礼物,两件礼物合起来送一人有三种方法,分开送两人有三种方法,所以一共六种方法
⑤ 关于礼物分配算法
#include<iostream>
using namespace std;
int main()
{
cout << "请输入n"<<endl;
int n;
cin>>n;
int *pn=new int[n];//输入礼物个数
float *pValue = new float[n]; //礼物价值
float *pValue1 = new float[n];//第一个人的礼物价值
float *pValue2 = new float[n];//第二个人的礼物价值
cout << "输入价值" <<endl;
for (int i = 0; i < n ; i ++) //将所有的值存起来
{
cin >> pValue[i];
}
int row1 = 0;
int row2 = 0;
float fvalue1 = 0;
float fvalue2 = 0;
for (int j = 0; j < n ; j ++)
{
if (fvalue1 <= fvalue2)
{
pValue1[row1] = pValue[j];
fvalue1 += pValue1[row1];
row1 ++;
}
else
{
pValue2[row2] = pValue[j];
fvalue2 += pValue2[row2];
row2 ++;
}
}
cout <<"第一个"<< fvalue1 << endl;
cout <<"第二个"<< fvalue2 << endl;
delete[] pn;
delete[] pValue;
delete[] pValue1;
delete[] pValue2;
pn = NULL;
pValue = NULL;
pValue1 = NULL;
pValue2 = NULL;
return 0;
}
⑥ 六一儿童节老师准备6分礼物,分给丽丽,红红,军军,每人至少分一分,有几种分法
您好,如果每一份礼物都不一样的话,可以分的方法有12种分法,如果礼物都是一样的,平均分配的话也就一种,每人两份
⑦ 排列组合:将5件不同的礼物全部分给甲乙丙丁4人,且每人至少有1件礼物,有多少种不同的分法
先将5件不同的礼物分成4堆,每堆至少有1件礼物,至多2件礼物,有C(5,2)=10种分法,然后针对每种分法,分给甲乙丙丁4人,即4的全排列:P(4,4)24,所以共有:24X10=240种不同的分法。