【题解】Healthy Holsteins

来源于USACO Training Gateway
重拾OI后的第一道水题,却调了一定时间,主要是边界没考虑好,这次写代码习惯倒是不错,简单的DFS,关键还是在于退出边界设置。
代码挺丑的。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int v,g,t;
int m=100;
int w[30],s[20][30],f[20],r[20];
void work(int d)
{
 int i,c=0;
 if(d>g+1) return;
 int b=1;
 for(i=1;i<=v;i++)
   if(w[i]>0)
    {
    b=0;
    break;
}

 if(b==1) {
  if(m>t)
  {
   m=t;
   for(i=1;i<=g;i++)
    if(f[i])r[++c]=i;
  }
  return;   
 }

 f[d]=1;
 t++;
 for(i=1;i<=v;i++)
  w[i]-=s[d][i];
 work(d+1);

 f[d]=0;
 t--;
 for(i=1;i<=v;i++)
  w[i]+=s[d][i];
  work(d+1); 

}
int main()
{
 cin>>v;
 for(int i=1;i<=v;i++)
  cin>>w[i];
 cin>>g;
 for(int i=1;i<=g;i++)
  for(int j=1;j<=v;j++)
   cin>>s[i][j];
 work(1);
 cout<<m<<" ";
 for(int i=1;i<=m;i++)
  cout<<r[i]<<" ";      
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值