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; }