POJ 2229 Sumsets

dp[i][j]表示i这个数字用前j个来拼凑有几种方案。

我写的时间复杂度是o(20000000),理论上打个表,然后o(1)输出妥妥的可以AC。

但是后台居然是一个文件一组数据的。。。。。。

做了点优化之后,C++ 压线AC 正好2000ms,G++1200ms。

此外,这题应该是可以找规律AC的。

15303733 14rj134 2229 Accepted 86572K 1329MS G++ 564B 2016-03-23 16:08:51
15303730 14rj134 2229 Accepted 86352K 2000MS C++ 564B 2016-03-23 16:08:30
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int dp[1000000+10][22];
int a[100];
const int mod=1000000000;
int n;

void work()
{
    a[1]=1;
    for(int i=2;i<=20;i++) a[i]=a[i-1]*2;
   // memset(dp,0,sizeof dp);
    for(int i=1;i<=20;i++) dp[0][i]=1;
    for(int j=1;j<=n;j++)
    {
        for(int i=1;i<=20;i++)
        {
            if(a[i]>j) {dp[j][i]=dp[j][i-1];continue;}
            dp[j][i]=(dp[j][i-1]+dp[j-a[i]][i])%mod;
        }
    }
}


int main()
{
    scanf("%d",&n);
    work();
    printf("%d\n",dp[n][20]);
    return 0;
}

 

posted @ 2016-03-23 16:16  Fighting_Heart  阅读(235)  评论(0编辑  收藏  举报