题意:n种容量的桶,每种无限. 求恰好装满v的缸需要的最少的桶
思路:深搜 + DP
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
bool flag, dp[maxn];
int m, n, v[204], ans[220], sum2;
bool judge (int p)
{
mem(dp, 0);
dp[sum2] = true;
for (int i = 0; i <= p; ++i) {
for (int j = sum2; j <= m; ++j)
dp[j + ans[i]] |= dp[j];
}
if(dp[m]) {
printf("%d", p + 1);
for (int i = 0; i <= p; ++i) {
printf(" %d", ans[i]);
}
return true;
}
return false;
}
void dfsid(int a, int b, int c)
{
if (flag) return;
sum2 += v[b];
ans[a] = v[b];
if(a == c) {
if (judge(c)) flag = true;
}
else {
for (int i = b + 1; i < n; ++i) {
dfsid(a+1, i, c);
}
}
sum2 -= v[b];
}
int main()
{
scanf("%d", &m);
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
sort(v, v + n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n - i; ++j) { //当有i种桶参与dp时 必须要n-i才能保证有i种桶均参与dfs
dfsid(0, j, i);
if(flag) return 0;
}
}
cout << ans << endl;
return 0;
}