题目简单,但是要注意格式,本人提交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[i].val <= n && a[i].num > 0) //判断如果取了后加起来的和有没有大过目标和及该数是否还存在{a[i].num--;dfs(cur_sum + a[i].val, i);a[i].num++; //注意把标记改回来}}
}int main()
{int s[10], k = 0; //用来存每组数据的结果,格式上的需要while(cin>>n>>m){ int i;for(i = 0; i < m; i++)cin>>a[i].val>>a[i].num;cnt = 0;dfs(0, 0);s[k++] = cnt;}for(int i = 0; i < k-1; i++)cout<<s[i]<<endl<<endl;cout<<s[k-1]<<endl;return 0;
}