hdu 1059 Dividing bitset 多重背包

bitset做法

#include <bits/stdc++.h>
#define PI acos(-1.0)
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define pb push_back
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que;
const double EPS = 1.0e-8;
typedef pair<int, int> pairint;
typedef long long ll;
typedef unsigned long long ull;
const int  maxn = 2e5 + 100;
const int  maxm = 300;
//next_permutation
//priority_queue<int, vector<int>, greater<int>> que;
int num[10];
bitset<120005>f;
int main()
{
        //freopen("bonuses.in", "r", stdin);
        //freopen("out.txt", "w", stdout);
        int t = 0;
        int sum = 0;
        //cin >> t;
        while (cin >> num[1] >> num[2] >> num[3] >> num[4] >> num[5] >> num[6] && (num[1] + num[2] + num[3] + num[4] + num[5] + num[6]))
        {
                t++;
                cout<<"Collection #"<<t<<":"<<endl;
                sum = 0;
                f.reset();
                f[0] = 1;
                for (int i = 1; i <= 6; i++)
                {
                        sum += num[i] * i;
                }
                if (sum % 2)
                {
                        cout << "Can't be divided." << endl;
                }
                else
                {
                        sum /= 2;
                        for (int i = 1; i <= 6; i++)
                        {
                                int g = 1;
                                int v = i;
                                int tot = num[i];
                                while (tot)
                                {
                                        f |= f << v;
                                        tot -= g;
                                        g = min(g * 2, tot);
                                        v = g * i;
                                }
                        }
                        if (f[sum])
                        {
                                cout << "Can be divided." << endl;
                        }
                        else
                        {
                                cout << "Can't be divided." << endl;
                        }
                        //for(int i=1;i<=sum;i++)
                        //cout<<f[i]<<" ";
                        //cout<<endl;
                }
                cout<<endl;
        }

}

多重板子做法

//多重背包
//HDU 1059
//题意:价值分别为1,2,3,4,5,6的物品的个数分别为 a[1],a[2],````a[6]
//问能不能分成两堆价值相等的
 
#include<stdio.h>
#include<string.h>
int a[7];
int f[120005];
int v,k;
void ZeroOnePack(int cost,int weight)//cost 为费用, weight 为价值 
{
    for(int i=v;i>=cost;i--)
       if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}    
void CompletePack(int cost,int weight)
{
    for(int i=cost;i<=v;i++)
        if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}         
void MultiplePack(int cost ,int weight,int amount)
{
    if(cost*amount>=v) CompletePack(cost,weight);
    else
    {
        for(int k=1;k<amount;)
        {
            ZeroOnePack(k*cost,k*weight);
            amount-=k;
            k<<=1;
        }    
        ZeroOnePack(amount*cost,amount*weight);
    }    
}    
int main()
{
    int tol;
    int iCase=0;
    while(1)
    {
        iCase++;
        tol=0;
        for(int i=1;i<7;i++)
        {
            scanf("%d",&a[i]);
            tol+=a[i]*i;//总价值数 
        }  
        if(tol==0) break;
        if(tol%2==1)
        {
            printf("Collection #%d:\nCan't be divided.\n\n",iCase);
            continue;
        }      
        else
        {
            v=tol/2;
            memset(f,0,sizeof(f));
            for(int i=1;i<7;i++)
              MultiplePack(i,i,a[i]);
            if(f[v]==v) 
              printf("Collection #%d:\nCan be divided.\n\n",iCase);
            else printf("Collection #%d:\nCan't be divided.\n\n",iCase);
        }    
    }    
    return 0;    
}

 

转载于:https://www.cnblogs.com/Aragaki/p/7620086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值