uva11485 Extreme Discrete Summation(DP)

首先那括号里的一坨是所有数的小数部分相加取下整

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\n",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\n",ans);
    }
    return 0;
}
uva11485

 

posted @ 2014-02-08 16:42  wonderzy  阅读(173)  评论(0编辑  收藏  举报