P1460 健康的荷斯坦奶牛 Healthy Holsteins(DFS)

题目描述

农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。

给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。

维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

输入输出格式

输入格式:

 

第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。

第2行:V个整数(1<=每个数<=1000),表示牛每天需要的每种维他命的最小量。

第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的种数。

下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。

 

输出格式:

 

输出文件只有一行,包括

牛必需的最小的饲料种数P

后面有P个数,表示所选择的饲料编号(按从小到大排列)。

如果有多个解,输出饲料序号最小的(即字典序最小)。

 

输入输出样例

输入样例#1: 复制

4
100 200 300 400
3
50  50  50  50
200 300 200 300
900 150 389 399

输出样例#1: 复制

2 1 3

 

  按照我一开始的思路,会卡三个点,因为数据规模太大了(且不说不溢出的答案对错),用LL也会溢出,我的处理方式就不对。

还不如一开始就用一个数组保存呢,*******************。

 

 

  Wa Code:

#include
#define INF 0x3f3f3f3f
#define eps 0.000000001
#define maxn  (LL )1e5+10
#define LL long long
using namespace std;
typedef pair pii;
//vector G[maxn];
LL  ans[100];
LL  sum[50][100];
LL  go[100]; LL  T;
LL  p[100];
vector v;
LL  N;
void dfs(LL  idx,LL  s)
{
    if(idx>N) return ;
    bool r=1;
    for(LL  i=1;i<=T;++i)
        go[i]+=sum[idx][i];
    if(idx/10==0) s=s*10+idx;
    else  s=s*100+idx;
    for(LL  i=1;i<=T;++i)
    {
        if(go[i]>T;
    for(LL  i=1;i<=T;++i)
        cin>>ans[i];
    cin>>N;
    bool y=1;LL  temp;
    for(LL  i=1;i<=N;++i)
    {
        bool r=0;
        for(LL  j=1;j<=T;++j)
        {
            cin>>sum[i][j];
            if(sum[i][j] st;
    LL  f=0;
    while(x)
    {
        st.push(x%10);
        x/=10;
        f++;
    }
    cout<

 接下来我们可以换个更简单的思路,延续上述代码基本思路,与其每进入一次dfs我们就判断一次还不如先保存下来种类编号,最后在判断。还有就是关于结果种类编号结果的处理,题目要求输出需要最小种类P,如果都满足要求就按字典序排,所以我们可以用字符数组保存编号,最后排序输出。

AC Code:

#include
#define LL long long
#define maxn (int)1e5
#define INF 0x3f3f3f3f
using namespace std;
int ans[50];
int arr[50][1200];
int pre[50];
int step;
 int T; int n,m;
 string S[maxn];
 char c[maxn];
 int sum[1200];
 int I=1;
 bool cmp(string a,string b)//排序,先按种类编号的个数排列,再按字典序排
 {
     if(a.size()!=b.size())  return a.size()n){//判断
            memset(sum,0,sizeof(sum));
        for(int i=1;i<=step;++i)
        {
            int k=pre[i];
            for(int j=1;j<=T;++j)
              sum[j]+=arr[k][j];
        }
        bool r=1;
        for(int i=1;i<=T;++i)
        if(ans[i]>sum[i]) {
            r=0;break;
        }
        if(r==1) {//如果满足要求就保存到字符数组里
            for(int i=1;i<=step;++i)
            c[i]=pre[i]+'0';
            string ss(c+1,c+step+1);
            S[I++]=ss;
        }
        return ;
    }
    pre[++step]=idx;
    dfs(idx+1);
    step--;
    dfs(idx+1);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>T;

    for(int i=1;i<=T;++i)
    {
        cin>>ans[i];
    }
    cin>>n;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=T;++j)
         cin>>arr[i][j];
    step=0;
    dfs(1);
    sort(S+1,S+I,cmp);
   // for(int i=1;i

 

你可能感兴趣的:(搜索)