首先那括号里的一坨是所有数的小数部分相加取下整
dp[x][y]表示前x个组成和为y的个数
#include <iostream> #include <cstdio> #include <cstring> #define eps 1e-9 #define ll long long using namespace std; int n; double v[110]; ll dp[10][110]; /* ll DP(int x,int value){ if(x==0) return value==0; if(dp[x][value]!=-1) return dp[x][value]; ll ret=0; for(int i=0;i<n;i++){ if(value>=int(v[i]*10+eps)%10) ret+=DP(x-1,value-int(v[i]*10+eps)%10); } return dp[x][value]=ret; } */ int main(){ while(~scanf("%d",&n)&&n){ //for(int i=0;i<n;i++) scanf("%lf",&v[i]); for(int i=1;i<=n;i++) scanf("%lf",&v[i]); /*ll ans=0; memset(dp,-1,sizeof dp); for(int i=0;i<=72;i++){ ans+=DP(8,i)*(i/10); } printf("%lld ",ans);*/ memset(dp,0,sizeof dp); dp[0][0]=1; for(int i=1;i<=8;i++){ for(int j=1;j<=n;j++){ for(int k=0;k<=72;k++){ if(dp[i-1][k]){ dp[i][k+int(v[j]*10+eps)%10]+=dp[i-1][k]; } } } } ll ans=0; for(int i=0;i<=72;i++){ ans+=dp[8][i]*(i/10); } printf("%lld ",ans); } return 0; }