首页 > 试题广场 >

礼物

[编程题]礼物
  • 热度指数:1680 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
“呼!!佳慧,我拿到面试直通卡了!”“吓死宝宝了!哦,你拿到直通卡了啊,好哒,进去吧,你可以直接接受老大的面试了”。
亮亮来到老大的办公室,“骚年,你想做什么工作啊?”“我要做大数据分析!!”
“哦~~那你先帮我们解决一个问题。是这样的,我们这次招聘会一共有N个人,我们公司给大家准备了一些礼物,但是我们并不知道这些人具体喜欢什么,现在库房共有m种礼物,每种礼物有Ci件,共N件。而我们大致知道每个人选择某种礼物的概率,即能知道Pij(编号为i的人选择第j种礼物的概率)。现在所有人按编号依次领礼物(第1个人先领,第N个人最后领),领礼物时,参加者会按照预先统计的概率告诉准备者自己想要哪一种礼物,如果该种礼物在他之前已经发放完了则他会领不到礼物,请帮我们计算出能能领到礼物的期望人数。

输入描述:
第一行包含两个整数N(1≤N≤300),M(1≤M≤100),用单个空格隔开。表示公有N个应聘者,M种礼物。
第二行为M个整数,依次为Ci,第i种礼物的个数。
接下来的N行,每行M个实数,一次为Pij,第i个人选择第j种礼物的概率。


输出描述:
一行输出期望人数。结果保留1位小数。
示例1

输入

2 2
1 1
0.3 0.7
0.7 0.3

输出

1.6(样例解释:共有4种选择(1,1),(1,2),(2,1),(2,2),概率分别为0.21、0.09、0.49、0.21,(1,1),(2,2)这两种选择只有1个人能拿到礼物,(1,2),(2,1)这两种选择有2个人能拿到礼物,所以期望为1*(0.21+0.21) + 2*(0.09+0.49) = 1.58,保留一位小数为1.6。)
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <list>
#include <stack>
#include <map>
//#include <set>
#include <utility>
#include <iterator>
#include <array>
#include <cstdlib>
#include <algorithm>
#include <numeric>
#include <climits>
#include <cstring>
#include <unordered_map>
#include <functional>
#include <iomanip>
using namespace std;

int main(int argc, char *argv[])
{
    int N, M;
    // N -> N 个应聘者, M -> M 种礼物
    while (cin >> N >> M) {
        vector<int> ci;//第 i 种礼物的个数
        ci.resize(M + 1);//共 M 种礼物, 下标从 1 开始
        for (int i = 1; i <= M; ++i) {
            cin >> ci[i];
        }
        vector<vector<double> > prob(N + 1, vector<double>(M + 1, 0));
        for (int i = 1; i <= N; ++i) {
            for (int j = 1; j <= M; ++j) {
                cin >> prob[i][j];
            }
        }//prob[i][j] -> 第 i 个人选取第 j 件礼物的概率
        vector<vector<vector<double> > > dp(N + 1, vector<vector<double> >(M + 1));
        // dp[i][j][k] 表示前 i 个 人选择礼物后, 第 j 种礼物 还剩下 k 个的概率
        for (int j = 0; j <= M; ++j) {
            for (int i = 0; i <= N; ++i) {
                dp[i][j].resize(ci[j] + 1);
            }
            dp[0][j][ci[j]] = 1;//一开始没有人选择的时候, 第 j 种礼物剩下ci[j]的概率为1
        }
        double ans = 0.0;
        for (int i = 1; i <= N; ++i) {
            for (int j = 1; j <= M; ++j) {
                for (int k = 0; k <= ci[j]; ++k) {
                    dp[i][j][k] = dp[i - 1][j][k] * (1 - prob[i][j])
                            + (dp[i - 1][j][k + 1] + (k == 0 ? dp[i - 1][j][0] : 0)) * prob[i][j];
                    if (i == N) {
                        ans += dp[i][j][k] * (ci[j] - k);
                    }
                }
            }
            
        }
        cout<<setiosflags(ios::fixed); //按点输出显示   
        cout<<setprecision(1); //精度为2
        cout << ans;
        cout << endl;
    }
    return 0;
}
动态规划问题。重点是状态转移方程。
其中 dp[i][j][k] 表示前 i 个人选则后, 第 j 种礼物还剩下 k 个的概率。

编辑于 2016-07-18 21:12:06 回复(4)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        while(s.hasNext()) {
            int n = s.nextInt(); //人数
            int m = s.nextInt(); //礼物种类数
            int[] gift = new int[m]; //每类礼物个数
            for(int i=0; i<m; i++) 
                gift[i] = s.nextInt();
            
            double[][] P= new double[n][m]; //每个人选择每种礼物概率
            for(int i=0; i<n; i++) {
                for(int j=0; j<m; j++) 
                    P[i][j] = s.nextDouble();
            }
            double leftGift = 0; //余下礼物数
             //对每类礼物进行循环
            for(int i=0; i<m; i++) {
                if(gift[i]==0)
                    continue;
                double[] leftpro = new double[gift[i]+1]; //此类礼物不同剩余个数(0-gift[i])的概率
                leftpro[gift[i]] = 1; //初始化为都在
                    //在每个人选择后对概率进行调整
                for(int j=0; j<n; j++) {
                    leftpro[0] = leftpro[0] + leftpro[1]*P[j][i];
                    for(int k = 1; k<gift[i]; k++) 
                        leftpro[k] = leftpro[k]*(1-P[j][i]) + leftpro[k+1]*P[j][i];
                    leftpro[gift[i]] = leftpro[gift[i]]* (1-P[j][i]);
                }
                for(int j=1; j<=gift[i]; j++) 
                    leftGift += leftpro[j] *j;
                
            }
            System.out.println((double) (Math.round((n - leftGift)*10)/10.0));
        }
    }
}

解题思路:
(领到礼物的人数)=(被领的礼物数)=(礼品总数)-(剩下的礼物数)
问题可以转化为求(剩下的礼物数),考虑某种礼物:
假设有3件,剩n件的概率为P_n,则派发礼物之前,P_3=1,P_2=P_1=P_0=0
假设第一个人选择这件礼物的概率是0.2,则经过他选择后,P_3=0.8,P_2=0.2,P_1=P_0=0
如此类推,经过第i个人选择后(选择概率为p),剩下k件的概率是:
P_k'=P_k*(1-p)+P_(k+1)*p (原本有k件的概率*不选择这礼物的概率 + 原本有k+1件的概率*选择这礼物的概率)
经过N个人选择后,就能得出剩下的期望数量就等于P_3*3+P_2*2+P_1*1
代码为了易懂,所以写得冗长一点,希望大家能读懂

发表于 2018-06-12 14:53:33 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main()
{     int n,m;     while(cin>>n>>m) {         vector<int> a(m,0);         vector<vector<double>> p(n,vector<double>(m,0));         for(int i=0;i<m;i++)             cin>>a[i];         for(int i=0;i<n;i++)             for(int j=0;j<m;j++)                 cin>>p[i][j];                      double res = 0;         for(int j=0;j<m;j++)         {             if(a[j] == 0)                 continue;             vector<double> resP(a[j]+1,0);             resP[a[j]] = 1;             for(int i=0;i<n;i++)             {                 resP[0] = resP[0] + resP[1]*p[i][j];                 for(int k=1;k<a[j];k++)                     resP[k] = resP[k]*(1-p[i][j]) + resP[k+1]*p[i][j];                 resP[a[j]] = resP[a[j]]*(1-p[i][j]);             }             for(int i=1;i<=a[j];i++)                 res += resP[i]*i;         }         printf("%.1f\n", round(((double)n - res)*10)/10);      }     return 0;
}

发表于 2017-11-14 02:05:21 回复(0)
概率DP,思路是把M件礼物分开来独立考虑 。

对于某件礼物,需要计算每个人想拿这个礼物却拿不到的概率(想拿的概率乘以礼物数量为0的概率),设rate [ i ]为第i个人想拿该礼物的概率,cntdp[ j ]为该礼物剩下 j 件的概率,则拿不到的概率为rate[ i ] * cntdp[ 0 ] 。
得到拿不到的概率后,需要对cntdp 进行更新,更新的方式为:
cntdp [ j ]+=cntdp [ j ]*rate[ i ]  ( j=0 )
cntdp [ j ]=(1-rate[ i ])*cntdp [ j ]+rate[ i ]*cntdp [ j+1]
对于所有的礼物都用以上的方法处理(初始cntdp 只有在该礼物数量的位置为1,其他为0),并将所有拿不到的概率相加,即为拿不到礼物的人数期望,然后用人数相减就得到结果了。
总时间复杂度为O(n^2*m)。
ps:为什么感觉这个方法特别复杂。。其他大神的思路貌似好多了。。 -  - !
pps : 由于礼物总和为n,将第54行的  for(j=1;j<=n;++j) 里的n改成礼物的数量,复杂度就减小到了O(n^2),不过不用太在意细节了 ^ _ ^  

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#include<queue>
#include<fstream>
#include<stdlib.h>
#include<ctime>
#include<vector>
using namespace std;
#define FOR(i,N) for(i=0;i<N;++i)
#define MEM(x,i) memset(x,i,sizeof(x))
#define COUT(DATA,ED) printf("%d%c",DATA,ED)
#define CIN(val)  scanf("%d",&val)
#define FCIN(val) fscanf(fp,"%d",&val)
#define LL long long
FILE *fp;
const int INF=250000;
int cnt[120];
double map[350][120];
int n,m;
double cntdp[350],rate[350];
double result;
void read(){
	int i,j;
	CIN(n);
	CIN(m);
	FOR(i,m){
		CIN(cnt[i]);
	}
	FOR(i,n){
		FOR(j,m){
			//fscanf(fp,"%lf",&map[i][j]);
			scanf("%lf",&map[i][j]);
		}
	}
}


void one_set(){
	double res=0.0;
	int i,j;
	for(i=0;i<n;++i){
		res+=rate[i]*cntdp[0];
		double sum=0.0;
		
		//for(j=0;j<=n;++j) sum+=cntdp[j];
		//if(fabs(sum-1.0)>1e-5) cout<<"wrong"<<endl;
		
		cntdp[0]+=rate[i]*cntdp[1];
		
		for(j=1;j<=n;++j){
			cntdp[j]*=(1.0-rate[i]);
			cntdp[j]+=(rate[i]*cntdp[j+1]);
		}
	}
	result-=res;
	
}
void set(){
	int i,j;
	result=(double)n;
	for(i=0;i<m;++i){
		for(j=0;j<n;++j){
			rate[j]=map[j][i];
			cntdp[j]=0.0;
		}
		cntdp[n]=0.0;
		cntdp[n+1]=0.0;
		cntdp[cnt[i]]=1.0;
		one_set();
	}
	printf("%.1lf\n",result);
}
int main(){
	fp=fopen("1.txt","r");
	read();
	set();
	return 0;
}

编辑于 2017-08-31 17:28:44 回复(0)
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
	int N, M;
	while (cin >> N >> M){
		vector<int> C(M, 0);//每种礼物的个数
		vector<vector<double>> pro(N, vector<double>(M, 0));//每个人选择而每种礼物的概率
		for (int i = 0; i<M; i++)
			cin >> C[i];
		for (int i = 0; i<N; i++)
			for (int j = 0; j<M; j++)
				cin >> pro[i][j];

		double leftGifts = 0;
		for (int j = 0; j<M; j++){
			if (C[j] == 0)continue;
			vector<double> leftPro(C[j] + 1, 0);//对于礼物j,剩下?件的概率
			leftPro[C[j]] = 1;
			for (int i = 0; i<N; i++){//每个人领后,概率更新情况
				leftPro[0] = leftPro[0] + leftPro[1] * pro[i][j];
				for (int k = 1; k<C[j]; k++)
					leftPro[k] = leftPro[k] * (1 - pro[i][j]) + leftPro[k + 1] * pro[i][j];
				leftPro[C[j]] = leftPro[C[j]] * (1 - pro[i][j]);
			}
			for (int i = 1; i <= C[j]; i++)//礼品j所剩总数
				leftGifts += leftPro[i] * i;
		}
		printf("%.1f\n", round(((double)N - leftGifts) * 10) / 10);
	}
	return 0;
}
/*解题思路:
(领到礼物的人数)=(被领的礼物数)=(礼品总数)-(剩下的礼物数)
问题可以转化为求(剩下的礼物数),考虑某种礼物:
假设有3件,剩n件的概率为P_n,则派发礼物之前,P_3=1,P_2=P_1=P_0=0
假设第一个人选择这件礼物的概率是0.2,则经过他选择后,P_3=0.8,P_2=0.2,P_1=P_0=0
如此类推,经过第i个人选择后(选择概率为p),剩下k件的概率是:
P_k'=P_k*(1-p)+P_(k+1)*p (原本有k件的概率*不选择这礼物的概率 + 原本有k+1件的概率*选择这礼物的概率)
经过N个人选择后,就能得出剩下的期望数量就等于P_3*3+P_2*2+P_1*1
代码为了易懂,所以写得冗长一点,希望大家能读懂
*/

发表于 2017-03-23 00:58:00 回复(5)
参考了董泽锋的做法
我再详细说一下思路:
dp[i][j][k] 表示的是前 i 个人选完礼物后礼物 j 还剩 k 个的概率。那么就有状态转移方程:
统计答案的时候,我们知道一个人只有一个礼物,那么原本的礼物数量减去 k 就是已被选走的数量 x,x 乘上 dp[n][j][k] 就是存在部分人选了 j 还剩 k 个的贡献 (期望)。
小技巧:使用滚动数组防止超内存。
#include <bits/stdc++.h>
#define QAQ 0x3f3f3f3f
using namespace std;
int a[101];
double dp[2][101][301],pij[301][101];
int main()
{
    int n,m,i,i1,i2;
    double ans=0;
    scanf("%d %d",&n,&m);
    for(i=1;m>=i;i++)
    {
        scanf("%d",&a[i]);
        dp[0][i][a[i]]=1;
    }
    for(i=1;n>=i;i++)
    {
        for(i1=1;m>=i1;i1++)
        {
            scanf("%lf",&pij[i][i1]);
        }
    }
    for(i=1;n>=i;i++)
    {
        for(i1=1;m>=i1;i1++)
        {
            for(i2=0;a[i1]>=i2;i2++)
            {
                if(i2==0)
                {
                    dp[i&1][i1][i2]=dp[(i-1)&1][i1][i2]*(1-pij[i][i1])+(dp[(i-1)&1][i1][i2+1]+dp[(i-1)&1][i1][i2])*pij[i][i1];
                }
                else if(i2!=a[i1])
                {
                    dp[i&1][i1][i2]=dp[(i-1)&1][i1][i2]*(1-pij[i][i1])+dp[(i-1)&1][i1][i2+1]*pij[i][i1];
                }
                else
                {
                    dp[i&1][i1][i2]=dp[(i-1)&1][i1][i2]*(1-pij[i][i1]);
                }
            }
        }
    }
    for(i=1;m>=i;i++)
    {
        for(i1=0;a[i]>=i1;i1++)
        {
            ans=ans+dp[n&1][i][i1]*(a[i]-i1);
        }
    }
    printf("%.1lf",ans);
    return 0;
}

发表于 2019-04-06 16:55:33 回复(0)
package recruit2016;

import java.util.ArrayList;
import java.util.Scanner;
//常规思路。代码思路对的,题目中的测试用例也能正确通过。无奈,并没有AC。。。
//原因提示代码复杂度过大超时了,但是还是决定放上来~共享一下~
//思路是根据题目自己对测试用例分析的逻辑来思考的:
//根据n和m求出所有可能性,放进list里,对每种可能性,求其出现概率和能够得到礼物的人数,相乘。最后全部加起来就是结果。
public class Practice58
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while(in.hasNext())
        {
            int n = in.nextInt();
            int m = in.nextInt();
            int[] c = new int[m];
            for(int i=0; i<m; i++)
            {
                c[i] = in.nextInt();
            }
            double[][] p = new double[n][m];
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    p[i][j] = in.nextDouble();
                }
            }
            ArrayList<int[]> list = new ArrayList<int[]>();
            deal(n, m, list);
            //totalProb表示最后结果
            double totalProb = 0;
            //对每种可能性求其出现概率和能够得到礼物的人数
            for(int[] num : list)
            {
                double prob = 1;
                int counter = 0;
                int[] tempc = new int[c.length];
                for(int i=0; i<tempc.length; i++)
                {
                    tempc[i] = c[i];
                }
                for(int i=0; i<num.length; i++)
                {
                    //prob为这种可能性出现的概率
                    prob *= p[i][num[i]];
                    //counter为这种可能性中能够得到礼物的人数
                    if(tempc[num[i]] > 0)
                    {
                        counter++;
                        //tempc数组表示第i种礼物有tempc[i]个,每次取完一个要减一
                        tempc[num[i]]--;
                    }
                }
                totalProb += prob*counter;
            }
            System.out.println(String.format("%.1f", totalProb));
        }
    }
    //deal作用,获得所有组合,放进list。
    //num数组表示第i个人想要第num[i]种礼物,要得到所有组合,实质是得到n位m进制数的全部组合
    public static void deal(int n, int m, ArrayList<int[]> list)
    {
        //得到十进制数最大是多少,然后从小到大对每一个转换成m进制,放进数组
        double sum = Math.pow(m, n);
        for(int i=0; i<sum; i++)
        {
            int[] num = new int[n];
            int index = n-1;
            int k = i;
            while(index >= 0)
            {
                num[index] = k%m;
                k = k/m;
                index--;
            }
            list.add(num);
        }
    }
}



发表于 2018-06-18 11:19:35 回复(0)
import itertools
s=input().split(" ")
n,m=int(s[0]),int(s[1])
c=input().split(" ")
for i in range(m):
    c[i]=int(c[i])
p=[]
for i in range(n):
    s=input().split(" ")
    for j in range(m):
        s[i]=float(s[i])
    p.append(s)
exception=0.0
a=[i for i in range(n)]
pp=1
for cc in c:
    for k in range(1,cc):
        for iterm in itertools.combinations(a,k):
            pp=1.0
            for i in range(n):
                if(i in iterm):
                    pp*=p[i][cc]
                else:
                    pp*=(1.0-p[i][cc])
            exception+=pp*k
print(exception)

老运行不出,求大神指导

发表于 2018-04-17 11:22:34 回复(0)
# -*- coding: utf-8 -*-
import copy
n,m=raw_input().split(' ')
n=int(n)
m=int(m)
giftnum=raw_input().strip().split(' ')
giftnum=[int(i) for i in giftnum]
total_gift=sum(giftnum)
pro=[]
p=[]
for i in range(n):     s=list(raw_input().strip().split(' '))     s=[float(j) for j in s]     pro.append(s)#各个应聘者取礼物的概率
for i in range(m):     lepro=[0 for o in range(giftnum[i]+1)]     lepro[0]=1     for j in range(n):         if len(lepro)>1:             lepro[-1]=lepro[-2]*pro[j][i]+lepro[-1]             for k in range(giftnum[i]-1,0,-1):                 lepro[k]=lepro[k-1]*pro[j][i]+lepro[k]*(1-pro[j][i])         lepro[0]=lepro[0]*(1-pro[j][i])         p.append(lepro)
for i in p:     i.reverse()     for j in range(len(i)-1,-1,-1):         total_gift-=(j*i[j])
print '%.1f' %total_gift

发表于 2017-10-22 16:16:40 回复(0)

import java.util.;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
int n = s.nextInt(); //人数
int m = s.nextInt(); //礼物种类数
int[] gnum = new int[m]; //每类礼物个数
for(int i=0; i<m; i++) {
gnum[i] = s.nextInt();
}
float[][] chance = new float[n][m]; //每个人选择每种礼物概率
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
chance[i][j] = s.nextFloat();
}
}
double leftgift = 0; //余下礼物数
//对每类礼物进行循环
for(int i=0; i<m; i++) {
if(gnum[i]==0)
continue;
double[] leftpro = new double[gnum[i]+1]; //此类礼物不同剩余个数(0-gnum[i])的概率
leftpro[gnum[i]] = 1; //初始化为都在
//在每个人选择后对概率进行调整
for(int j=0; j<n; j++) {
leftpro[0] = leftpro[0] + leftpro[1]
chance[j][i];
for(int k = 1; k<gnum[i]; k++) {
leftpro[k] = leftpro[k](1-chance[j][i]) + leftpro[k+1]chance[j][i];
}
leftpro[gnum[i]] = leftpro[gnum[i]] (1-chance[j][i]);
}
for(int j=1; j<=gnum[i]; j++) {
leftgift += leftpro[j]
j;
}
}
System.out.println((double) (Math.round((n - leftgift)*10)/10.0));
}
s.close();
}
}

发表于 2017-05-14 10:51:08 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
int main(){
	int n,m;
	while (cin >> n>>m ){
		vector<int>c(m);//m种,每种c[i]个,共n件 
		vector<vector<double> >p(n, vector<double>(m));
		for (int i = 0; i < m; i++){
			cin >> c[i];
		}
		for (int i = 0; i < n; i++){
			for (int j = 0; j < m; j++){
				cin >> p[i][j];
			}
		}
		vector<vector<double> >dp(m);//dp[i][j]是第i种礼物剩下j的概率,也是第i种礼物被取走c[i]-j的概率
		for (int i = 0; i < m; i++){
			dp[i] = vector<double>(c[i] + 1);
			dp[i][c[i]] = 1.0;
		}
		//k个人依次取
		for (int k = 0; k < n; k++){
			for (int i = 0; i < m; i++){
				if (c[i] != 0){
					dp[i][0] = dp[i][0] + dp[i][1] * p[k][i];
					for (int j = 1; j < c[i]; j++){
						dp[i][j] = dp[i][j] * (1 - p[k][i]) + dp[i][j + 1] * p[k][i];
					}
					dp[i][c[i]] *= (1 - p[k][i]);
				}
			}
		}
		//求期望
		double E = 0;
		for (int i = 0; i < m; i++){
			for (int j = 0; j <= c[i]; j++){
				E += dp[i][j] * (c[i] - j);
			}
		}
		cout << setiosflags(ios::fixed);
		cout << setprecision(1);
		cout << E << endl;

	}

	return 0;
}
** 居然过了,感谢各位大神提供的思路

发表于 2017-04-18 16:12:31 回复(0)
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<iomanip>
#include<set>
using namespace std;
void add1(vector<int> &count,int m){
    int n=count.size();
    count[n-1]++;
    int i=n-1;
    while(i>=1&&count[i]==m){
        count[i]-=m;
        count[i-1]++;
        i=i-1;
    }
    
}
bool finished(vector<int> &count,int m){
    int n=count.size();
    bool f=true;
    for(int i=n-1;i>=0;i--){
        if(count[i]<m-1){
            f=false;
            break;
        }
    }
    return f;
}
enmeint min(int a,int b){
    return a<b?a:b;
}
int numdiff(vector<int> &count,vector<int> &numpresents,int m){
    vector<int> tmp(m,0);
    for(int i=0;i<count.size();i++){
        tmp[count[i]]++;        
    }
    int res=0;
    for(int i=0;i<m;i++){
        res+=min(tmp[i],numpresents[i]);
    }
    return res;
    
}
int main(){
    int n,m;
    while(cin>>n>>m){
        if(n==1){
            cout<<setiosflags(ios::fixed)<<setprecision(1)<<1.0<<endl;
            continue;
        }
        vector<int> numpresents(m,0);
        for(int i=0;i<m;i++){
            cin>>numpresents[i];
        }
        vector<vector<double>> p(n,vector<double>(m,0));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>p[i][j];
            }
        }
        vector<int> count(n,0);
        count[n-1]=-1;
        bool f=false;
        double res=0;
        while(f==false){
            add1(count,m);
            int d=numdiff(count,numpresents,m);
            double pro=1;
            for(int j=0;j<n;j++){
                pro*=p[j][count[j]];
            }
            res+=pro*d;
            f=finished(count,m);
        }
        cout<<setiosflags(ios::fixed)<<setprecision(1)<<res<<endl;
    }
    return 0;
} 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
shen me yuan yin ?

发表于 2016-05-22 11:53:34 回复(0)