DP Coins(多重背包)

题目:
给出一些价值的硬币,每种硬币有一定的数量,给出一个数m,问用这些硬币可以组合成价值1到m中的几个数。

解析:
用vis数组记录第i个背包用的次数。
代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
const double PI=acos(-1);
using namespace std;
const int maxx=200000;
int vis[maxx];
bool dp[maxx];
int v[maxx];
int c[maxx];
int main()
{
    int n,m,i,j,k;
    while(~scanf("%d%d",&n,&m))
    {
        int ans=0;
        if(n==0 && m==0)
            break;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&c[i]);
        dp[0]=1;
        for(i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            for(j=v[i];j<=m;j++)
            {
                if( dp[j]==0 && dp[j-v[i]]==1 && vis[j-v[i]]<c[i])
                {
                    dp[j]=1;
                    vis[j]=vis[j-v[i]]+1;
                }
            }
        }
        for(i=1;i<=m;i++)
            ans+=dp[i];
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41243063/article/details/81407290