poj1742

来源:互联网 发布:电子相册软件app排行榜 编辑:程序博客网 时间:2024/05/22 18:39
dp[MAXN] 前i种加和成j  i的剩余
ai    (dp[i][j] >= 0)
dp[i+1][j] = {-1     (j < ai  or dp[i+1][j-ai] <= 0)   }
dp[i+1][j-ai]   (其他)
数组再利用
Source CodeProblem: 1742User: fistyMemory: 756KTime: 1782MSLanguage: G++Result: Accepted    Source Code    #include <cstdio>    #include <algorithm>    #include <cstring>    using namespace std;    #define MAX_N 100100    #define MAX_C 1010    int n,m;    int a[MAX_N],c[MAX_C];    int dp[MAX_N];  //前i种加和成j,i的剩余    void solve(){            memset(dp, -1, sizeof(dp));            dp[0] = c[0];            for(int i = 0;i < n; i++){                    for(int j = 0;j <= m; j++){                            if(dp[j] != -1) dp[j] = c[i];                            if(dp[j] == -1){                                    if(j >= a[i] && dp[j-a[i]] != -1){                                            dp[j] = dp[j - a[i]] - 1;                                    }                            }                    }            }            int sum = 0;            for(int j  = 1;j <= m; j++){                    if(dp[j] != -1) sum++;            }            printf("%d\n", sum);    }    int main(){            while(scanf("%d%d", &n, &m) && n && m)  {                  for(int i = 0;i < n; i++)                          scanf("%d", &a[i]);                  for(int i = 0;i < n; i++)                          scanf("%d", &c[i]);                                      solve();            }            return 0;           }


0 0