1711: 背包
时间限制: 1 Sec 内存限制: 128 MB提交: 119 解决: 67
[ 提交][ 状态][ 讨论版]
题目描述
你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?
输入
第一行 n,m
第二行 n个数字
输出
输出方案数
样例输入
3 40
20 20 20
样例输出
3
提示
应该算是比较dfs。刚开始接触 就是在本子上写了样例具体走的一个过程 然后照着模板走了一遍。
模板代码:
void dfs(变量){
if(超出阈值){
return;
}
if(条件成立){
ans++;
return;
}
for(int i=s;i<n;i++){
dfs(step+1);
}
return;
}
直接贴代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,x[30],i,j,ans;
void dfs(int cnt,int s){
if(!cnt){
ans++;
return;
}
if(s>n||cnt<0)
return;
for(int i=s;i<n;i++)
dfs(cnt-x[i],i+1);
return;
}
int main(){
while(cin>>n>>m){
for(i=0;i<n;i++)cin>>x[i];
ans=0;
dfs(m,0);
cout<<ans<<endl;
}
return 0;
}
看了一下另一个同学这题的dfs:
void dfs(int s,int k)
{
int i;
if(s==0)
{
ans++;
return;
}
if(s<0||k>n)
return;
dfs(s-a[k],k+1);
dfs(s,k+1);
return;
}
虽然演算了一遍是差不多 但是不是很理解