题解
这道题我一直想着用dp来解,因为我觉得和01背包很像。
但是这个容量数据没办法用数组表示,所以一直想不到解法。
我默认dfs是会指数爆炸的不好解法,所以一开始就没考虑,但这题的数据很弱…
代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m;
int v[26],p[16][26];
int eat[16],ans[16];
int cur_s=0,min_s=30;
bool eatup(){// 吃够了?
for(int k=1;k<=n;k++)
if(v[k] > 0 ) return false;
return true;
}
void dfs(int k){
if( eatup() ){// 吃够了 判断 更新答案
if( cur_s < min_s ){
min_s = cur_s;
int pos,i;
pos = i = 1;
while(pos<=m){
if(eat[pos])
ans[i++] =pos;
pos++;
}
}
return;
}
if( k > m ) return;
for(int i=1;i<=n;i++)// 吃
v[i]-=p[k][i];
eat[k] = 1;
cur_s++;
dfs(k+1);
eat[k] = 0; // 不吃
for(int i=1;i<=n;i++)
v[i]+=p[k][i];
cur_s--;
dfs(k+1);
}
int main(void){
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
cin>>m;
for(int i=1;i<=m;i++)
for(int k=1;k<=n;k++)
cin>>p[i][k];
dfs(1);
cout<<min_s<<" ";
for(int i=1;i<=min_s;i++)
cout<<ans[i]<<" ";
cout<<endl;
return 0;
}