这道题还是比较复杂的,首先是用递归来求得最少的种类数。递归遍历就两种情况,包含或不包含,分成两个分支。然后取两者中少的那种,需要注意,这里面的少,并不是单纯的比较大小,而是要自己定义比较函数。求出最少种类数后,需要用一个结构体来存放,将原有的程序改装成用结构体表示即可。代码如下。
#include<bits/stdc++.h>
using namespace std;
int hn=0,hm=0;
int hv[30],hg[20][30];
struct Node {
int num;
string str;
bool operator < (const Node & p) const { return num < p.num; }
};
int hjudge(int a[],int b[]){
for (int i=1;i<=hm;i++){
if (b[i]<a[i]){
return 0;
}
}
return 1;
}
struct Node hmin(struct Node x1,struct Node x2){
if (x1.num==0){
return x2;
}
else if (x2.num==0){
return x1;
}
return x1<x2 ? x1:x2;
}
struct Node hdp(int x,int cv[], string last){
struct Node result;
char c[10];
sprintf(c,"%d",x);
result.str = last+" "+c;
if (hjudge(cv,hg[x])){
result.num = 1;
return result;
}
else if (x==hn){
result.num = 0;
return result;
}
int dv[30];
for(int i=1;i<=hm;i++){
dv[i]=cv[i]-hg[x][i];
if (dv[i]<0){
dv[i]=0;
}
}
struct Node x1=hdp(x+1,dv,last+" "+c);
struct Node x2=hdp(x+1,cv,last);
if (x1.num!=0){
x1.num+=1;
}
return hmin(x1,x2);
}
int main(){
freopen ("holstein.in","r",stdin);
freopen ("holstein.out","w",stdout);
cin>>hm;
for (int i=1;i<=hm;i++){
cin>>hv[i];
}
cin>>hn;
for (int i=1;i<=hn;i++){
for (int j=1;j<=hm;j++){
cin>>hg[i][j];
}
}
struct Node ans = hdp(1,hv,"");
cout<<ans.num<<ans.str<<endl;
return 0;
}