这一题如果是采用暴力手段,不一定能获得正确答案,而且也非常耗时。
所以下面我们采用一个小技巧,也就是先产生n-1个红包,总得sum<m的,这样最后只要添加一个sum-m的红包钱数就可以了。
具体看下面的代码:
// n个红包m块钱.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <iostream> #include <vector> #include <time.h> #define min(x,y) (x)<(y)?x:y using namespace std; void randMN(int sumM,int countN,vector<int> &vec) { if(sumM<=0||countN<=0||sumM<countN) return; int count=countN-1; int sum=sumM; while(count>0) { srand((int)time(0)); int sumTemp=sum-count; //这里的sumTemp=sum-count 其中count可以为其他数(要保证大于countN), //其主要是为剩余的数字留下填补的空间,至少可以用1补上 int minD=min(sumTemp,100); //这里minD防止数字是大于100的 不符合条件 int resultD=rand()%minD+ 1; vec.push_back(resultD); sum -= resultD; --count; } vec.push_back(sum); //这表明最后一个数字并不是随机产生的,只是相应补上去的,凑成sunmM } int main(int argc, char* argv[]) { vector <int> v; randMN(200,10,v); for (int i=0;i<v.size();i++) cout<<v[i]<<" "; cout<<endl; return 0; }
http://blog.csdn.net/morewindows/article/details/8439393