找零 动态规划
好久沒寫動態(tài)規(guī)劃,中午聽到學(xué)長們討論的一道題,就是給出一組硬幣面額,和一個目標(biāo)數(shù)值,求有幾種找零方式(想半天沒想清楚)
#include <iostream> #include <cstdlib>using namespace std;int count(int* s, int m, int n) {if (n == 0) return 1;if (n < 0 || m <= 0) return 0;return count(s, m - 1, n) + count(s, m, n-s[m-1]); }int main() {int arr[] = {1, 2, 3};int m = sizeof(arr) / sizeof(int);cout<<count(arr, m, 4)<<endl;system("pause");return 0; }這是dfs暴力搜索
下面是未優(yōu)化的dp代碼
int count_dp(int *s, int m, int n) {int rows = m + 1;int cols = n + 1;int* dp = new int[rows * cols];for (int i=0; i<cols; i++) dp[i] = 0;for (int i=0; i<rows; i++) dp[i * cols] = 1;for (int i=1; i<rows; i++) {int base = i * cols;for (int j=1; j<cols; j++) {int va = 0, vb = dp[base - cols + j];if (j - s[i-1] >= 0) {va = dp[base + j - s[i-1]];}dp[base + j] = va + vb;}}int ret = dp[cols * rows - 1];delete[] dp;return ret; }感覺這類問題在分解為最優(yōu)子問題時總是劃分為某個元素取與不取,還是沒什么長進
參考:
http://www.acmerblog.com/dp6-coin-change-4973.html
轉(zhuǎn)載于:https://www.cnblogs.com/lailailai/p/3717946.html
總結(jié)
- 上一篇: Careercup - Google面试
- 下一篇: 用python读写excel(xlrd、