NC15948. 背包问题
描述
01背包是是一个普通的动态规划入门问题:
一共有n个物品, 第i个物品的体积为v[i];
有一个背包容量为m,现在我要挑选一些物品放入这个背包
我现在知道在总体积不超过背包容量的情况下,他一共有多少种放法(总体积为0也算一种放法)。
1 <= n <= 30, 1 <= m , v[i]<= 1e9
很简单吧,但是……,你试一试吧。
输入描述
输入有多组,每一组第一行是n和m
接下来第二行到第n+1行,第i+1行表示v[i]。
输出描述
输出每个样例的方案数,每个答案占据一行。
示例1
输入:
3 10 1 2 4
输出:
8
C 解法, 执行用时: 2ms, 内存消耗: 300K, 提交时间: 2021-11-13 09:31:35
#include <stdio.h> #define ll long long int ans; int n,m; int a[50]; void dfs(int x,int sum) { if(x==n) { ans++; return; } dfs(x+1,sum); if(sum+a[x]<=m) dfs(x+1,sum+a[x]); } int main() { while(~scanf("%d%d",&n,&m)) { ans=0; for(int i=0;i<n;i++) scanf("%d",&a[i]); dfs(0,0); printf("%d\n",ans); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 352K, 提交时间: 2020-02-28 22:16:03
#include<iostream> using namespace std; int n,m; int w[35]; int dfs(int dx,int v) { if(v<0) return 0; if(v==0) return 1; if(dx==n+1) return v>=0; return dfs(dx+1,v)+dfs(dx+1,v-w[dx]); } int main() { while(cin>>n>>m) { for(int i=1;i<=n;i++) cin>>w[i]; cout<<dfs(1,m)<<endl; } return 0; }