来源于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]<<" ";
}