|
题目简单,但是要注意格式,本人提交5次,前4次均PE
#include <iostream>
using namespace std;
const int maxn = 10 + 10;
int n, m, cnt;
typedef struct datatype //定义数据类型
{
int val;
int num;
}data;
data a[maxn]; //要输入的数组
void dfs(int cur_sum, int last) //深度优先遍历
{
int i;
if(cur_sum == n) //当目前的和==目标和时
{
cnt++;
}
else for(i = last; i < m; i++) //当目前的和!=目标和时
{
if(cur_sum + a.val <= n && a.num > 0) //判断如果取了后加起来的和有没有大过目标和及该数是否还存在
{
a.num--;
dfs(cur_sum + a.val, i);
a.num++; //注意把标记改回来
}
}
}
int main()
{
int s[10], k = 0; //用来存每组数据的结果,格式上的需要
while(cin>>n>>m)
{ int i;
for(i = 0; i < m; i++)
cin>>a.val>>a.num;
cnt = 0;
dfs(0, 0);
s[k++] = cnt;
}
for(int i = 0; i < k-1; i++)
cout<<s<<endl<<endl;
cout<<s[k-1]<<endl;
return 0;
}
|
|
|