题目 | 输入 | 输出 | 限制 | 示例 |
某股票操盘手账户里有N支股票,股价互不等,分别为v1,v2...vn;每支股票的持有股数为m1,m2...mn。现在操盘手要回笼资金需要卖出股票,假设卖出价格即为当前股价,请问能回笼多少种不同的资金量。比如:两支股票,股价分别为10、11,数量为1、2,则能回笼0、10、11、22、21、32,总共6种资金量 |
输入的第一行指定用例数量T; |
输出不同资金量的个数 |
1<=n<=10 |
Input: Output: |
【实现代码】:
1 #include <stdio.h> 2 3 int result[100000]; 4 int count; 5 6 void combination(int* arr,int i,int cnt) 7 { 8 if(i >= cnt) 9 { 10 int sum = 0; 11 for(int j=0; j<cnt; j++) 12 { 13 sum += arr[j]; 14 } 15 for(int j=0; j<count; j++) 16 { 17 if(sum == result[j]) return; 18 } 19 result[count++] = sum; 20 return; 21 } 22 23 int temp = arr[i]; 24 arr[i] = 0; 25 combination(arr,i+1,cnt); 26 arr[i] = temp; 27 combination(arr,i+1,cnt); 28 } 29 30 int main() 31 { 32 int t = 0; 33 scanf("%d",&t); 34 while(t--) 35 { 36 int n = 0; 37 scanf("%d",&n); 38 39 int val[n]; 40 for(int i=0; i<n; i++) 41 { 42 scanf("%d",&val[i]); 43 } 44 45 int num[n]; 46 int cnt = 0; 47 for(int i=0; i<n; i++) 48 { 49 scanf("%d",&num[i]); 50 cnt += num[i]; 51 } 52 53 int arr[n*cnt]; 54 cnt = 0; 55 for(int i=0; i<n; i++) 56 { 57 for(int j=0; j<num[i]; j++) 58 { 59 arr[cnt++] = val[i]; 60 } 61 } 62 printf("\n"); 63 combination(arr,0,cnt); 64 printf("%d \n",count); 65 } 66 }
【代码效果】:
原文:https://www.cnblogs.com/usingnamespace-caoliu/p/8975261.html