poj1276 Cash Machine(完全背包模板题)

题目链接:https://vjudge.net/problem/POJ-1276

题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数.......

思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的

完全背包:

//这题可以让w,v从i=1时开始,这样f[0]=0,当cash=0或n=0时直接输出0
//定义一个num数组来让它存储还剩下多少个数

#include <iostream>
#include <cstring>

using namespace std;

const int maxn=1000+10;

int cash,n;
int w[maxn],v[maxn];
int f[maxn*100],num[maxn*100];

int main()
{
    ios::sync_with_stdio(false);
    while(cin>>cash>>n)
    {
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            cin>>w[i]>>v[i];
        }

        for(int i=1;i<=n;i++)
        {
            memset(num,0,sizeof(num));
            for(int j=v[i];j<=cash;j++)
            {
                if(f[j]<f[j-v[i]]+v[i]&&num[j-v[i]]<w[i])
                {
                    f[j]=f[j-v[i]]+v[i];
                    num[j]=num[j-v[i]]+1;
                }
            }
        }
        cout<<f[cash]<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Fy1999/p/9151970.html