uva 165 Stamps
2013-10-22 17:08
204 查看
首先以递归的方式枚举K个面值位置的数值,注意当前位置cur的面值的数值的枚举范围应该是上一个位置的面值数值加1作为下限,h张邮票使用前面的cur-1种面值是能达到的连续的最大数值作为上限,下限的选取是为了不形成重复,上限选取的原理是不形成断点,因为当前的枚举位置的面值如果超过了上限,不管怎么安排邮票的取法,都会形成断点,综上所述,程序中会有两个递归函数,一个是用来算连续的最大数值应该是多少,另一个用来枚举每个位置的面额值,程序并不复杂,但是解题的思路还是有一点巧妙的。
#include <stdio.h> #include <set> #include <vector> using namespace std; int mianzhi[100]; int money_num[100]; int max_money_num; int max_serial; set<int> value; vector<int> result; //计算当前能够达到的连续的最大的面值 void dfs1(int cur, int last_money_num, int max_pos) { int i; int sum; if(cur == max_pos+1) { sum = 0; for(i=1; i<=max_pos; i++) { sum += money_num[i]*mianzhi[i]; //算出一种邮票的组合 value.insert(sum); } return; } for(i=0; i<=max_money_num-last_money_num; i++) { money_num[cur] = i; dfs1(cur+1, last_money_num+i, max_pos); } } void dfs(int cur, int last_max, int max_pos) { if(cur > max_pos) { if(last_max > max_serial) { max_serial = last_max; result.clear(); for(int i=1; i<=max_pos; i++) result.push_back(mianzhi[i]); } return; } int i; for(i=mianzhi[cur-1]+1; i<=last_max+1; i++) { mianzhi[cur] = i; value.clear(); dfs1(1, 0, cur); set<int>::iterator it_i, it_j; int max; for(it_i=value.begin(), it_j=value.begin(), it_j++; it_j!=value.end(); it_i++, it_j++) { if(*it_j==*it_i+1) { max = *it_j; } else { max = *it_i; break; } } dfs(cur+1, max, max_pos); } } void func(int h, int k) { mianzhi[1] = 1; max_money_num = h; max_serial = 0; dfs(2, h, k); for(int i=0; i<result.size(); i++) { printf("%3d", result[i]); } printf(" ->"); printf("%3d\n", max_serial); } int main(void) { int h, k; //freopen("input.dat", "r", stdin); while(1) { scanf("%d %d", &h, &k); if(!h && !k) break; func(h, k); } return 0; }
相关文章推荐
- uva 165 Stamps
- UVA 165- Stamps
- UVA - 165 Stamps
- UVa 165 - Stamps
- uva 165 Stamps
- UVA 165 Stamps (DFS深搜回溯)
- UVa 165 - Stamps 深搜
- uva 165 - Stamps
- uva 165 - Stamps
- UVa 165 - Stamps, 连续邮资问题
- UVa 165 - Stamps
- uva 165 Stamps (回溯)
- UVA 165 - Stamps
- uva 165 Stamps (DFS)
- uva 165 - Stamps
- UVA 165 Stamps
- UVA 165 Stamps
- uva 165 - Stamps
- UVa 165 Stamps 【DFS】
- UVA 165 Stamps (DFS深搜回溯)