poj 1742 Coins (背包)

来源:互联网 发布:数据库字段注释 编辑:程序博客网 时间:2024/04/30 19:56

这道题直接多重背包算的话会超时,但是按完全背包dp但在计算过程中用一个标记数组标记一下加了几次该coin 得到该值。这样可以使时间复杂度降低很多。。。

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const int N = 111;const int M = 111111;int a[N], c[N];int dp[M];int mark[M];int main(){    int n, m;    while(scanf("%d%d", &n, &m), n + m)    {        for(int i = 0; i < n; i ++) scanf("%d", &a[i]);        for(int j = 0; j < n; j ++) scanf("%d", &c[j]);        memset(dp, 0, sizeof(dp));        dp[0] = 1;        for(int i = 0; i < n; i ++)        {            for(int j = 0; j <= m; j ++) mark[j] = 0;//标记数组,记得每次都置零            for(int j = 0; j <= m - a[i]; j ++)            {                if(dp[j] && !dp[j + a[i]] && mark[j] < c[i])                {                    dp[j + a[i]] = 1;                    mark[j + a[i]] = mark[j] + 1;                }            }        }        int ans = 0;        for(int i = 1; i <= m; i ++) if(dp[i]) ans ++;        printf("%d\n", ans);    }}


原创粉丝点击