牛客線上程式設計_牛牛的揹包問題
阿新 • • 發佈:2020-01-24
題目地址
給n個物品的體積和揹包的總容量,問能裝下的方案數。
- 搜尋+剪枝,當剩餘容量小於字尾最小值時直接返回1,即全不選,當剩餘容量大於字尾和時直接返回1<<len。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=32;
int n;
ll w,v[N],mn[N],suf[N];
ll dfs(int idx,ll rem){
if(rem<mn[idx]){
return 1;
}
if(rem>=suf[idx]){
return 1ll<<n-idx+1;
}
if(idx==n){
if(rem>=v[idx]){
return 2;
}else{
return 1;
}
}
ll ans=0;
if(rem>=v[idx]){
ans+=dfs(idx+1,rem-v[idx]);
}
ans+=dfs(idx+1,rem);
return ans;
}
int main(){
scanf("%d%lld",&n,&w);
for(int i=1;i<=n;i++){
scanf("%lld",&v[i]);
}
mn[n+1]=0x3f3f3f3f;
for(int i=n;i>=1;i--){
mn[i]=min(mn[i+1],v[i]);
suf[i]=suf[i+1]+v[i];
}
ll ans=dfs(1,w);
printf("%lld\n",ans);
return 0;
}