C - 高橋君とカード / Tak and Cards
Time limit : 2sec / Memory limit : 256MB
Score : 300 points
Problem Statement
Tak has N cards. On the i-th (1≤i≤N) card is written an integer xi. He is selecting one or more cards from these N cards, so that the average of the integers written on the selected cards is exactly A. In how many ways can he make his selection?
Constraints
- 1≤N≤50
- 1≤A≤50
- 1≤xi≤50
- N, A, xi are integers.
Partial Score
- 200 points will be awarded for passing the test set satisfying 1≤N≤16.
Input
The input is given from Standard Input in the following format:
N A x1 x2 … xN
Output
Print the number of ways to select cards such that the average of the written integers is exactly A.
Sample Input 1
Copy
4 8 7 9 8 9
Sample Output 1
Copy
5
- The following are the 5 ways to select cards such that the average is 8:
- Select the 3-rd card.
- Select the 1-st and 2-nd cards.
- Select the 1-st and 4-th cards.
- Select the 1-st, 2-nd and 3-rd cards.
- Select the 1-st, 3-rd and 4-th cards.
Sample Input 2
Copy
3 8 6 6 9
Sample Output 2
Copy
0
Sample Input 3
Copy
8 5 3 6 2 8 7 6 5 9
Sample Output 3
Copy
19
Sample Input 4
Copy
33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
Sample Output 4
Copy
8589934591
- The answer may not fit into a 32-bit integer.
题意:给定一串数字,问能够组成多少种不连续子串使得子串的平均数为某个数
题解:用动态规划,i表示相加的个数,j表示加起来后的值
#include<bits/stdc++.h> using namespace std; const int N=55; long long dp[N][N*N]; //dp值会爆int int main() { int n,a; cin>>n>>a; dp[0][0]=1; for(int i=1;i<=n;i++) { int x; cin>>x; for(int j=i-1;j>=0;j--) //每一次个数向下减少 for(int k=0;k<=N*j;k++) //优化时间 由于k最大为N*j次 dp[j+1][k+x]+=dp[j][k]; //个数加1 则找到前面个数的值相加 } long long ans=0; for(int i=1;i<=n;i++) ans+=dp[i][i*a]; //累计所有个数会出现平均值满足a的情况 cout<<ans<<endl; return 0; }