Many Formulas
题意:给一个由数字组成的字符串,可在其中加任意个‘+’ 求所有情况之和
思路:二进制枚举,有s个数字就有2^(s-1)种情况
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int arr[10];
string s;
signed main(){
cin>>s;
for(int i=0;i<s.size();i++){
arr[i] = (int)(s[i]-'0');
}
int n=s.size()-1;
int ans = 0;
for(int i=0;i<(1<<n);i++){
int t=arr[0];
for(int j=0;j<s.size();j++){
if(i & (1<<j)||j == n){
ans += t;
t=0;
}
t = t*10+arr[j+1];
}
}
cout<<ans<<endl;
return 0;
}
Tak and Cards
题意:有N个卡牌,给出一数A,随机选卡牌使其平均数为A,求有几种情况
思路:最开始也想用二进制枚举,但是TLE(悲),故采用dp,最后dp[i][i*A]的和即为总情况数目
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int arr[55];
int dp[55][55*55];
int n,avg;
signed main(){
cin>>n>>avg;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=i;j>0;j--){
for(int k=n*avg;k>=arr[i];k--){
dp[j][k]+=dp[j-1][k-arr[i]];
}
}
}
int ans = 0;
for(int i=1;i<=n;i++){
ans += dp[i][i*avg];
}
cout<<ans<<endl;
return 0;
}