USACO 2.3 Money Systems(DP)

以前见过这类问题,都是用母函数给水过去的,这个应该也能用母函数水过(猜测)。母函数复杂度高,记得见过一种更高效的DP方式,非常神奇只是改变了一下dp的顺序就把重复给去掉了。一种一直递推到v种,这样更新是无重复的,这样递推是假设最后一个是c[i],以前的状态中都没有含有c[i]的情况。

 1 /*
 2  ID: cuizhe
 3  LANG: C++
 4  TASK: money
 5 */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cmath>
10 #include <algorithm>
11 using namespace std;
12 long long dp[10001],c[30];
13 int main()
14 {
15     int i,n,j,v;
16     freopen("money.in","r",stdin);
17     freopen("money.out","w",stdout);
18     scanf("%d%d",&v,&n);
19     for(i = 1;i <= v;i ++)
20     scanf("%d",&c[i]);
21     sort(c+1,c+v+1);
22     dp[0] = 1;
23     for(i = 1;i <= v;i ++)
24     {
25         for(j = c[i];j <= n;j ++)
26         {
27             dp[j] += dp[j-c[i]];
28         }
29     }
30     printf("%lld\n",dp[n]);
31     return 0;
32 }
posted @ 2012-11-13 08:56  Naix_x  阅读(166)  评论(0编辑  收藏  举报