zoukankan      html  css  js  c++  java
  • 组合数学

    // Memory   Time
    // 1347K     0MS
    // by : Snarl_jsb
    // 2014-09-19-18.23
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<map>
    #include<string>
    #include<climits>
    #include<cmath>
    #define N 1000010
    #define LL long long
    using namespace std;
    
    int n;
    int c1[N],c2[N];
    int val[N],cnt[N];
    int main()
    {
        ios_base::sync_with_stdio(false);
        cin.tie(0);
    //    freopen("C:\Users\ASUS\Desktop\cin.cpp","r",stdin);
    //    freopen("C:\Users\ASUS\Desktop\cout.cpp","w",stdout);
        while(cin>>n)   //n种类型的物品
        {
            long long sum=0;
            for(int i=1;i<=n;++i)
            {
                cin>>val[i]>>cnt[i];     //单位价值  数量
                sum+=val[i]*cnt[i];
            }
            memset(c1,0,sizeof(c1));
            memset(c2,0,sizeof(c2));
            for(int i=0;i<=cnt[1]*val[1];i+=val[1])
            {
                c1[i]=1;
            }
            for(int i=2;i<=n;++i)
            {
                for(int j=0;j<=sum;++j)
                {
                    for(int k=0;k<=cnt[i];++k)
                    {
                        c2[k*val[i]+j]+=c1[j];      // 不要忘了加号
                    }
                }
                for(int j=0;j<=sum;++j)
                {
                    c1[j]=c2[j];
                    c2[j]=0;
                }
            }
            // ............ 剩下的就根据题目来变形
            //c1[i]:取出一些物品,这些物品价值的和为i的取法有c1[i]种
             for(int i=0;i<=sum;++i)
             {
                 printf("%d ",c1[i]);
             }
             puts("");
        }
        return 0;
    }
    
    
    
    
    //另:
    //每种物品都有无限个
    /*
    //
    //第1种物品的价值为1,有无限个;
    //第2种物品的价值为2,有无限个;
    //第3种物品的价值为3,有无限个;
    //.......
    //问取出一些物品的价值总和为n的取法有多少个?
    #include <iostream>
    using namespace std;
    
    const int _max = 10001;
    int c1[_max], c2[_max];
    // c1是保存各项质量砝码可以组合的数目
    // c2是中间量,保存每一次的情况,维持c1的不变性
    int main()
    {
        int nNum;
        int i, j, k;
        while(cin >> nNum)    //要组合的目标数
        {
            for(i=0; i<=nNum; ++i)   // ---- ① 首先对c1初始化,由第一个表达式(1+x+x2+..xn)初始化,把质量从0到n的所有砝码都初始化为1.
            {
                c1[i] = 1;
                c2[i] = 0;
            }
            for(i=2; i<=nNum; ++i)   // ----- ②i从2到n遍历,这里i就是指第i个表达式,上面给出的第二种母函数关系式里,每一个括号括起来的就是一个表达式。
            {
                for(j=0; j<=nNum; ++j)   // -----③j 从0到n遍历,这里j就是只一个表达式里第j个变量,比如在第二个表达式里:(1+x2+x4....)里,第j个就是x2*j.
                    for(k=0; k+j<=nNum; k+=i)  // ---- ④ k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。
                    {
                        c2[j+k] += c1[j];
                    }
                for(j=0; j<=nNum; ++j)     // ---- ⑤把c2的值赋给c1,而把c2初始化为0,因为c2每次是从一个表达式中开始的
                {
                    c1[j] = c2[j];
                    c2[j] = 0;
                }
            }
            cout << c1[nNum] << endl;
        }
        return 0;
    }
    
    */
    

      

  • 相关阅读:
    Angular6实现点击表格当前项判断批量操作按钮是否可以操作
    Angular实现全选后的取消其中一个选项则不能实现全选
    Angular6实现复选框的全选
    vue+element-ui 实现数据的增删改查以及分页(举例新增学生)
    vue基于element-ui制作的成绩管理系统(四)个人信息
    vue基于element-ui制作的成绩管理系统(三)主界面 登录后跳转的页面
    vue基于element-ui制作的成绩管理系统(二)登录页
    vue基于element-ui制作的成绩管理系统(二)搭建开发系统
    vue基于element-ui制作的成绩管理系统(-)设计思路
    git版本管理与github
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3982095.html
Copyright © 2011-2022 走看看