题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4152
题目解析:DFS或递归
#include <cstdio> //dfs
#include <cstring>
#define M 25
int a[M], b[M], mp[M][M], n, m, vis[M], ans;
bool judge() {
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < m; j++) {
if (vis[j]) sum += mp[j][i];
}
if (sum < a[i]) return false;
}
return true;
}
void dfs(int pos) {
if (pos == m) {
if (judge()) {
int tot = 0;
for (int i = 0; i < m; i++)
if (vis[i]) tot++;
if (ans < tot) {
ans = tot;
for (int i = 0; i < m; i++) b[i] = vis[i];
}
}
return;
}
vis[pos] = 1;
dfs(pos + 1);
vis[pos] = 0;
dfs(pos + 1);
}
int main(void) {
while(scanf("%d",&n)!=EOF){ //n个目标
for (int i = 0; i < n; i++) scanf("%d", &a[i]); //a数组存储达到n个目标各自需要的数值
scanf("%d", &m); //m个爱好
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) scanf("%d", &mp[i][j]); //mp数组存储每个爱好对各个目标的影响
memset(vis, 0, sizeof(vis));
memset(b, 0, sizeof(b));
ans = 0;
dfs(0);
printf("%d", ans);
for (int i = 0; i < m; i++)
if (b[i]) printf(" %d", i + 1); //数组b存储被保留的爱好
puts("");
}
return 0;
}