接上集与上上集又双双叒叒叒叕叕叕叕说道(与上集和上上集没有任何关系),虽然红太狼和灰太狼停止了争论。但是,当他们回头查看小羊的时候,小羊们已经没有在原来的位置上了。
在喜羊羊和小伙伴们的努力下,小羊们挣脱绳索跑出了狼屋,现在在他们面前有一道悬崖,如果不想办法尽快离开这个地方,灰太狼还会再把他们抓回去的。
此时,懒羊羊大声喊道:“快看啊,这边有一些热气球,我们可以乘上热气球离开!”
已知热气球数量为 s, 单个热气球最大承重是 200 千克。按照编号,小羊们各自的体重为wi千克。现在小羊们正在利用有限的时间,商量着哪只羊去乘坐哪个热气球。
当然,商量的过程并没有什么好看的。作为观众,你突然来了兴趣,想要写一个程序,统计一下羊们有多少种不同的乘坐方案。(只要有一只羊的位置不同,就认为是乘坐方案不同)
输入第一行有 2 个整数,分别为 n,s;
第二行有 n 个整数,分别为小羊们的体重 wi。
输出输出一个整数,表示所有可行的乘坐方案的数量。
样例①输入
5 2 170 24 32 44 63
①输出
4
②输入
4 3 91 97 143 123
②输出
6提示 数据范围
1≤n,s≤10
wi≤200
样例1说明小羊们逃跑时乘坐的热气球编号方案如下:
方案一:1 1 2 2 2
方案二:1 2 2 2 2
方案三:2 1 1 1 1
方案四:2 2 1 1 1
共有4种方案,所以答案为4。
既然上两道题都用的dfs,那么这道题用dfs也很简单。思路也是互通的(意思是:思路不知道,自己想)
代码如下:
#include
using namespace std;
int vis[20];
int ans=0;
int n,s,b[100]={0};
bool q[100]={0};
void dfs(int t) { // 羊
if(t>n) {
ans++;
return;
}
for(int i=1; i<=s; i++) {
if(vis[i]+b[t]<=200) {
vis[i]+=b[t];
dfs(t+1);
vis[i]-=b[t];
}
}
} int main() {
cin>>n>>s;
for(int i=1; i<=n; i++) {
cin>>b[i];
}
dfs(1);
cout<
return 0;
}



