poj 1742coins(优化的多重背包)

好好研究一下代码:

#include<iostream>
#include<string.h>
using namespace std;
int dp[100005],p[105],c[105];
int num[100005];
int main()
{
    int n,m,i,j,k,cnt;
    while(cin>>n>>m)
    {
        if(n==0&&m==0)
            break;
        for(i=0;i<n;i++)
            cin>>p[i];// 记录硬币的价值 
        for(i=0;i<n;i++)
            cin>>c[i];//记录各硬币的数量 
        for(i=0;i<=m;i++)
            dp[i]=0;//标记数组 (相当于vis)
        dp[0]=1;
        cnt=0;
        //滚动数组 
        for(i=0;i<n;i++)
        {
            for(j=0;j<=m;j++)//记录使用次数
                num[j]=0;
            for(j=p[i];j<=m;j++)
            {
                if(!dp[j]&&dp[j-p[i]]&&num[j-p[i]]<c[i])
                {
                    num[j]=num[j-p[i]]+1;
                    dp[j]=1;
                    cnt++;//记录种数
                }
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/90346512