• ACdreamoj1110(多重背包)


    意甲冠军:多个裸露的双肩背包。水的问题。


    解决方法:然背包一样,仅仅只是加一个数组,记录着每一个物品用过的次数,多于存储量时就pass不更新。

              另一种方法是将每一个物品用二进制压缩处理。第一个代码比較简单;


    代码:

    /******************************************************
    * author:xiefubao
    *******************************************************/
    #pragma comment(linker, "/STACK:102400000,102400000")
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #include <set>
    #include <stack>
    #include <string.h>
    //freopen ("in.txt" , "r" , stdin);
    using namespace std;
    
    #define eps 1e-8
    #define zero(_) (abs(_)<=eps)
    const double pi=acos(-1.0);
    typedef long long LL;
    const int Max=100010;
    const int INF=1000000007;
    
    int a[103];
    int num[103];
    int rem[Max];
    bool ans[Max];
    int n,cap;
    int main()
    {
        int t;
        //cout<<pow(6,4)-1<<endl;
        scanf("%d",&t);int kk=1;
        while(t--)
        {
            memset(ans,0,sizeof ans);
            scanf("%d%d",&n,&cap);
            for(int i=0; i<n; i++)
                scanf("%d",a+i);
            for(int i=0; i<n; i++)
                scanf("%d",num+i);
            ans[0]=1;
            for(int i=0; i<n; i++)
            {
                memset(rem,0,sizeof rem);
                for(int j=0; j<=cap; j++)
                {
                    if(j+a[i]>cap||rem[j]>=num[i])
                        continue;
                    if(ans[j])
                    {
                        if(ans[j+a[i]])
                        {
                            rem[j+a[i]]=min(rem[j+a[i]],rem[j]+1);
                            continue;
                        }
                        ans[j+a[i]]=1;
                        rem[j+a[i]]=rem[j]+1;
                    }
                }
            }
            int out=0;
            for(int i=1; i<=cap; i++)
                if(ans[i])
                    out++;
            printf("Case %d: %d
    ",kk++,out);
        }
        return 0;
    }
    /*
    4 100000
    1 12 456 5678
    5 5 5 5
    */
    

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    ToString格式化
    [转]vc中socket编程步骤
    [XAML学习资料] 验证用户提供的数据ValidationRule
    VS2008下安装boost
    [ASP.NET用户验证一]Forms验证
    VISTA IIS Worker Process 已停止工作 解决办法
    [MFC入门二]四种不同对象
    删除TFS项目
    [WPF学习资料] WPF简介
    IIS7下配置PHP5
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4796979.html
Copyright © 2020-2023  润新知