趋势科技第二题8.8技术分享
经典的动态规划问题,多重背包,但是问题不是求方案总数,而是求解方案数组合长度问题。
面值 1,5,10,20,50,100元,输入第一行为,集中面值的个数,问组成M元的方案长度为多大?
例如:
输入:
6 5 4 3 2 1
11
输出:
12
解析:最后得出的组合有三种,分为{1 1 1 1 1 1 7 5}、{1 5 5}、{1 10}
长度之和为7+3+2=11.
条件动态规划 #include<iostream> #include<vector> using namespace std; //int v[1001] = {0}; //int f[1001] = {0}; struct F { int value; int len; }f[1001]; int main() { int v[7] = {0, 1, 5, 10, 20, 50, 100 }; int arr[7] = { 0 }; int m = 0; while (cin >> arr[1] >> arr[2] >> arr[3] >> arr[4] >> arr[5] >> arr[6]) { cin >> m; f[0].value = 1; f[0].len = 0; for (int i = 1; i < 1001; i++) { f[i].value = 0; f[i].len = 0; } for (int i = 1; i <= 6; i++) { for (int j = m; j >= v[i]; j--) { for (int k = 1; k <= j / v[i] && k <= arr[i]; k++) { if (f[j - k*v[i]].value == 1) { f[j].len += k; f[j].len += f[j - k*v[i]].len; } f[j].value += f[j - k*v[i]].value; } } } cout << f[m].value<<" "<<f[m].len << endl;//输出方案数和方案总长度 } system("pause"); return 0; }