序列操作Ⅰ
描述
给定长度为 N 的正整数序列 A_1, A_2, A_3,…, A_N, 从中选出若干个数,使它们的和是 M,求有多少种选择方案。
输入
第一行是两个数字,表示 N 和 M。(N,M<1000)
输出
一个数字,表示和为 M 的组合的个数。
输入样例 1
4 4
1 1 2 2
输出样例 1
3
//序列操作Ⅰ
//代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,c=0;
void f(int i,int sum,int a[])
{
if (sum>m) return;
if (sum==m){
c++;
return;
}
for (;i<n;i++)
f(i+1,sum+a[i],a);
}
int main()
{
scanf("%d %d",&n,&m);
int a[n+5],t=0;
for (int i=0;i<n;i++) {
scanf("%d",&a[i]);
t+=a[i];
}
if (t<m) printf("0\n");
else if (t==m) printf("1\n");
else{
f(0,0,a);
printf("%d\n",c);
}
return 0;
}
装箱问题(也可以用背包来做)
描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
每个测试文件只包含一组测试数据,每组输入的第一行为一个整数V(0<=V<=20000),表示箱子的容量。
第二行输入一个整数n(0<n<=30),表示有n个物品。
接下来n行,每行输入一个正整数,表示每个物品的体积。
输出
对于每组输入数据,输出一个整数,表示箱子剩余空间。
输入样例 1
24
6
8
3
12
7
9
7
输出样例 1
0
#include <bits/stdc++.h>
using namespace std;
int a[35],n,v,flag=0,ans;
void f(int i,int sum)
{
if (sum==v){
flag=1;
return;
}
for (;i<=n;i++){ //如果当i=2时循环结束了,就++变成3传进去做
if (!flag && (sum+a[i])<=v){
ans=min(ans,v-(sum+a[i]));
f(i+1,sum+a[i]);
}
}
}
int main()
{
scanf("%d %d",&v,&n);
ans=v;
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
f(1,0);
printf("%d\n",ans);
return 0;
}