#include<bits/stdc++.h>
using namespace std;
int k,m,a[10][110],f[10];
long long ans;
void dfs(int x,long long s){
if(x==k+1){
if(s>m)ans++;
return;
}if(s>m){
long long n=1;
for(int i=x;i<=k;i++){
n=n*(f[x]+1);
}ans+=n;
return;
}for(int i=0;i<=f[x];i++){
dfs(x+1,s+a[x][i]);
}
}
int main(){
cin>>k>>m;
for(int i=1;i<=k;i++){
cin>>f[i];
for(int j=1;j<=f[i];j++){
cin>>a[i][j];
}
}dfs(1,0);
cout<<ans;
return 0;
}
1 个赞
有没有hack数据?然后我问一下,我看了代码之后,想确认一下,您的思路是不是就是跑一遍dfs,如果每类物品都搜完了,就记录方案,然后做了一个剪枝,如果已经大于了,那么剩下的选不选无所谓,就是分选或者是不选的,然后如果没有,那么继续搜索。是这样的吗?
是的
你能下一组数据吗?
因为我看着这个思路每什么问题,最多我认为加的特判就是一开始如果全部最大都不行就是 0 。
输入
5 37
29 26 26 34 45 29 22 37 28 40 15 38 46 48 23 42 17 28 24 21 14 42 28 35 15 17 34 36 20 47
21 30 23 28 38 15 29 14 15 42 18 50 35 20 18 12 10 28 23 49 26 22
15 22 31 50 31 39 30 21 48 33 15 30 50 37 14 28
27 15 28 24 29 11 38 14 48 33 18 19 25 25 15 15 41 14 41 31 35 38 50 27 49 15 33 38
37 41 38 30 35 12 46 19 11 39 45 23 15 25 29 33 36 42 41 29 48 18 29 34 31 50 26 28 29 43 42 23 18 33 17 18 36 21
目标输出
11235120
实际输出
4798880
你解决方案给自己什么意思???
直接分组背包啊
@郑涞允1
@潘柯翰 禁止回老帖