您的位置:首页 > 其它

USACO 2.1.4Healthy Holsteins

2011-07-16 12:00 253 查看
// holstein.cpp : 定义控制台应用程序的入口点。
//
/*
ID: maiyuet1
PROG: holstein
LANG: C++
*/
//#include "stdafx.h"
/* 直接DFS,N <= 15;每种只有2种情况,拿或不拿,2^15*/
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;

int need[30];   //最少所需
int value[30][30];
int ans[30];
int ans_cnt;
int n,m;
int used[30];

//满足牛的最少需求
int judge(int temp[])
{
for(int i=1; i<=n; i++)
{
if(temp[i] < need[i])
{
return 0;
}
}
return 1;
}

//是否能作为最优解
int judge1(int flag[], int cnt)
{
for(int i=1; i<=cnt; i++)
{
if(flag[i] > ans[i])
{
return 0;
}
}
return 1;
}

void dfs(int temp[],int k, int cnt, int flag[])
{
//剪枝,数量比最优解大,直接返回
if(cnt > ans_cnt)
{
return ;
}
//在满足牛的最低需求情况下,如果数量比最优解小 或者 字典序比最优解小则更新)
if(judge(temp) && (cnt < ans_cnt || judge1(flag,cnt)))
{
for(int i=1; i<=cnt; i++)
{
ans[i] = flag[i];
}
ans_cnt = cnt;
return ;
}
int lishi[30];
//局部变量lishi保存起来,以便回溯使用
for(int i=1; i<=n; i++)
{
lishi[i] = temp[i];
}
for(int i=k+1; i<=m; i++)
{
if(!used[i])
{
used[i] = 1;
for(int j=1; j<=n; j++)
{
temp[j] += value[i][j];
}
flag[cnt+1] = i;
dfs(temp,i,cnt+1,flag);
//回溯
used[i] = 0;
for(int j=1; j<=n; j++)
{
temp[j] = lishi[j];
}
}
}
}

int main()
{
freopen("holstein.in","r",stdin);
freopen("holstein.out","w",stdout);
ans_cnt = 1000;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>need[i];
}
cin>>m;
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
cin>>value[i][j];
}
}
int temp[30];
int flag[30];
memset(temp,0,sizeof(temp));
memset(flag,0,sizeof(flag));
dfs(temp,0,0,flag);
cout<<ans_cnt;
for(int i=1; i<=ans_cnt; i++)
{
cout<<" "<<ans[i];
}
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: