问题 C: 神奇的口袋
题目链接:http://codeup.cn/problem.php?cid=100000583&pid=2
思路
- 将每个物品的体积写入数组a[];
- 题目要求是凑40体积的物品,对于单个物品来说,可以取走它或者不取走它
- 比如对于第1个物品a[0]来说,它的方法分两种,取走a[0],或者不取走a[0]
- 即ways(40,0) = ways(40-a[0],1) + ways(40,1)
- 令体积为v,元素序号为i
- 构造函数int ways(int v,int i) 可以想到递归式为return ways(v,i+1)+ways(v-a[i],i+1)
- 考虑边界问题,i会一直加1,直到i超出数组a的长度,即i==n;(n为数组a的长度)
- v会一直减少,直到v等于0,满足题目条件,返回1
- 考虑v-a[i]<0的情况,说明当前这个元素无法选取,那就选择当前不能选择的元素的下一个元素,让序号加1,ways( v, i) = ways(v,i+1)
代码
#include <iostream>
using namespace std;
int a[30];
int n;
int ways(int v,int i) {
if (v==0)
return 1;
if (i==n)//超出了
return 0;
if (v-a[i]>=0)
return ways(v,i+1)+ways(v-a[i],i+1);
else
return ways(v,i+1);
}
int main() {
while (scanf("%d",&n)!=EOF) {
for (int i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
printf("%d\n",ways(40,0));
}
return 0;
}
一定要细心,在codeup中练习,结果返回答案错误,一要检查输出的“格式”是否正确!比如换行和空格