2018大华软件大赛模拟赛第4题 (某股票操盘手账户里有N支股票,股价互不等)

题目:某股票操盘手账户里有N支股票,股价互不等,分别为v1,v2...vn;每支股票的持有股数为m1,m2...mn。

   现在操盘手要回笼资金需要卖出股票,假设卖出价格即为当前股价,请问能回笼多少种不同的资金量。

          比如:两支股票,股价分别为10、11,数量为1、2,则能回笼0、10、11、22、21、32,总共6种资金量

输入:输入的第一行指定用例数量T;
      用例的第一行输入股票种类n;
   用例的第二行输入股票的价格,以空格隔开;
   用例的第三行输入股票的数量,已空格隔开;

输出:输出不同资金量的个数

限制: 1<=n<=10
      1<=v<=20
    1<=m<=6

Input:
1
2
10 11
1 2

Output:
6

这道题是个秤砣砝码的问题(动态规划) 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int fun(int n, int money[], int num[])
  5 {
  6     int allmoney = 0 , i , j;
  7     for(i = 0; i < n; i++)
  8     {
  9         allmoney = allmoney + money[i] * num[i]; //求所有的资金量
 10     }
 11 
 12     int flag[10000] = {0}; //判断存在的资金量
 13     
 14     flag[allmoney] = 1;
 15     //先计算第0种股票能够得到的资金里量,并且计算0种股票最大的资金量
 16     int tempmoney = 0;
 17     for(i = 0; i <= num[0]; i++)
 18     {
 19         flag[money[0] * i] = 1;
 20     }
 21     tempmoney = money[0] * num[0];
 22 
 23     i = 1; //第1种股票
 24     int currentmoney;
 25     int newmoney;
 26 
 27     while(i < n)
 28     {
 29         int f[10000] ={0};
 30         for(j = 1; j <= num[i]; j++)
 31         {
 32             //采用试探的方法 逐次加1
 33             for(currentmoney = 0; currentmoney <= tempmoney; currentmoney++)
 34             {
 35                 newmoney = currentmoney + j * money[i];
 36                 if(newmoney > allmoney)
 37                 {
 38                     break;
 39                 }
 40                 if(flag[currentmoney]  && flag[newmoney] == 0
 41                 &&    currentmoney != money[i])
 42                 {
 43                     f[newmoney] =1;
 44                 }
 45             }
 46         }
 47         //更新已经存在的资金量
 48         tempmoney = tempmoney + num[i] * money[i];
 49         for(int p = 0; p <= tempmoney; p++)
 50         {
 51             if(f[p])
 52             {
 53                 flag[p] = f[p];
 54             }
 55         }
 56         i++;
 57     }
 58 
 59     //统计数量
 60     int count = 0;
 61     for(i = 0; i < 10000; i++)
 62     {
 63         if(flag[i] == 1)
 64         {
 65             count++;
 66         }
 67     }
 68         return count;
 69 }
 70 
 71 int main()
 72 {
 73     int n1, n2;
 74     //int a[20] = {0};
 75     //int b[20] = {0};
 76 
 77     scanf("%d",&n1);
 78     for(int k =0; k < n1; k++ )
 79     {
 80         int count = 0;
 81         scanf("%d",&n2);
 82         int *a = (int *) calloc(n2,sizeof(int));
 83         int *b = (int *) calloc(n2,sizeof(int));
 84 
 85         for(int i = 0; i < n2; i++)
 86         {
 87             scanf("%d",&a[i]);
 88         }
 89 
 90         for(int i = 0; i < n2; i++)
 91         {
 92             scanf("%d",&b[i]);
 93         }
 94         for(int i =0; i < n2 -1; i++)
 95         {
 96             for(int j = 0; j < n2-i -1; j++)
 97             {
 98                 if(a[j] > a[j+1])
 99                 {
100                     int t = a[j];
101                     a[j] = a[j+1];
102                     a[j+1] = t;
103                     
104                     t = b[j];
105                     b[j] = b[j+1];
106                     b[j+1] =b[j];
107                 }
108             }
109         }
110         count = fun(n2,a,b);
111         printf("%d\n",count);
112     }
113 
114     return 0;
115 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值