1 2 5 10 20 --> 800
用1元 2元 5元 10元 20元的钞票凑成800元的方法种数计算,使用了动态规划。
结果没打出来,只是保留在函数里各个vector中,调试可看所有结果。
优点:快
缺点:占空间占内存
耗时时间测试:
和为200:0.0022153191s
和为800:0.025958383s
和为1600:0.062776931s
和为3200:0.18964779s
下面是详细代码,能正常运行算出结果,改进空间很大,只列了思路。
算法为王,C写的O(n2)函数再快也不如R写的O(nlogn)函数。
void CMFCTestDlg::OnBnClickedBegin() { UpdateData(TRUE); LARGE_INTEGER beginTime; QueryPerformanceCounter(&beginTime); std::vector<int> vec_1_2(m_nTotal+1, -1); for(int i=0; i<=m_nTotal; i++) { vec_1_2[i] = 1+i/2; // 使用1元 2元纸币组合成 0到m_nTotal 元的方法数 } std::vector<int> vec_1_2_5(vec_1_2.begin(), vec_1_2.end()); for(int i=5; i<=m_nTotal; i++) { for(int j=1; j<=i/5; j++) { vec_1_2_5[i] += vec_1_2[i-j*5]; // 使用1元 2元 5元纸币组合成 0到m_nTotal 元的方法数 } } std::vector<int> vec_1_2_5_10(vec_1_2_5.begin(), vec_1_2_5.end()); for(int i=10; i<=m_nTotal; i++) { for(int j=1; j<=i/10; j++) { vec_1_2_5_10[i] += vec_1_2_5[i-j*10]; // 使用1元 2元 5元 10元纸币组合成 0到m_nTotal 元的方法数 } } std::vector<int> vec_1_2_5_10_20(vec_1_2_5_10.begin(), vec_1_2_5_10.end()); for(int i=20; i<=m_nTotal; i++) { for(int j=1; j<=i/20; j++) { vec_1_2_5_10_20[i] += vec_1_2_5_10[i-j*20]; // 使用1元 2元 5元 10元 20元纸币组合成 0到m_nTotal 元的方法数 } }
//.... 如果有50元 100元等更多要求,在此处依次添加即可,很容易扩展
LARGE_INTEGER endTime; QueryPerformanceCounter(&endTime); LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); float fTime = (endTime.QuadPart-beginTime.QuadPart)/(float)(frequency.QuadPart); fTime = 0; }