A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 善良的禽兽 中级黑马   /  2015-9-27 11:33  /  240 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


#include "cstdio"
#include "cmath"
#include "fstream"
#include "cstring"
#include "algorithm"
#include "iostream"
#include "vector"
#include "queue"
#include "stack"
#include "set"
#include "map"
#define lson root<<1
#define rson root<<1|1
#define lowbit(i) i&(-i)
#define debug(x) cout<<#x<<"="<<x<<endl;
#define here cout<<endl<<"_______________here "<<endl;
#define INF 0x7f7f7f7f
#define LINF 0x7f7f7f7f7f7f7f7f
#define Prime 999983
#define N 12
using namespace std;
int weight[N];
int dp1[1<<N], dp2[1<<N];
int n, cap1, cap2;


int getwei(int state)
{
           int tot(0);
           for(int i = 0; i < n; i++)
           {
                      if(state & (1<<i))
                           tot += weight;
           }
           return tot;
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    #endif
    int T, t(1), gg, minn;
    scanf("%d", &T);
    while(T--)
    {
             minn = INF;
             scanf("%d%d%d", &n, &cap1, &cap2);
             for(int i = 0; i < n; i++)
                    scanf("%d", weight + i);
      
             memset(dp1, 9999, sizeof(dp1));
             memset(dp2, 9999, sizeof(dp2));
             dp1[0] = dp2[0] = 0;
             for(int state = 0;  state < (1<<n); state++)
             {
                       gg = getwei(state);
                       if(gg <= cap1)
                             dp1[state] = 1;
                       else
                             for(int i = 0; i <= state; i++)
                                       dp1[state] = min(dp1[state], dp1[state ^ i] + dp1);
                       
                       if(gg <= cap2)
                             dp2[state] = 1;
                       else
                             for(int i = 0; i <= state; i++)
                         dp2[state] = min(dp2[state], dp2[state ^ i] + dp2);
             }
             for(int i = 0; i < (1<<n); i++)
              for(int j = 0; j < (1<<n); j++)
                     if((i | j) == (1<<n) - 1)
                           minn = min(minn, max(dp1, dp2[j]));
             printf("Scenario #%d:\n%d\n\n",t++, minn);
    }
    return 0;
}








0 个回复

您需要登录后才可以回帖 登录 | 加入黑马