題意:
乙個人有許多種硬幣: a1, a2, a3, a4 .....ai (1 <= i <= n);
每一種硬幣有許多個: c1, c2, c3, c4 .....ci (1 <= i <= n);
問他可以用硬幣組成多少種不超過 m 的**;
理解:這是樓教主的男人必過八題;
可惜了,自己做不來;
神解釋說是多重揹包;
但是和書上的不一樣;
其實遞推式才是真正有用的東西;
遞推式含義:dp[i] 表示能否通過前面已求出來的確定**推導出 i 這個**;
即:dp[i] = (dp[i - a[i]] == 1);
其中 a[i] 使用了的個數不能超過 c[i] 個;
**如下:
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef pairpii;
const int min_inf = 1e-7;
const int max_inf = (1e9) + 7;
#define x first
#define y second
int dp[100100], sum[100100];
int main()
for (int i = 0; i < n; ++i)
memset(dp, 0, sizeof(dp));
int ans = 0;
dp[0] = 1; //初始值 0 一直都是被計算出來的值,也不需要計算
for (int i = 0; i < n; ++i) }}
cout << ans << endl;
}return 0;
}
POJ 1742多重揹包問題
include include include include includeusing namespace std define maxn 105 define maxl 100005 int weight maxn c maxn f maxl user maxl int main printf ...
poj 1742 多重揹包(單調佇列)
如題 又是這道題 第一種方法是二進位制拆分多重揹包 能過hdu2488 見我這一篇 第二種是為了減小時間複雜度,通過改變dp策略 能過poj1742 不能過杭電 這裡說第三種,多重揹包的0 vn 複雜度演算法。使用了單調佇列。這位大牛寫的很清楚 也就是找出狀態轉移方程中的重複狀態,然後將容量拆成v拆...
POJ1742 動態規劃 多重揹包
題意 問多重部分和能否恰好等於m。思路 dp i j 用前i種面額硬幣湊成j後,第i種硬幣最多剩下的個數,若湊不成則為 1.可優化空間複雜度。反思 想不出應該如此定義dp陣列。include using namespace std int a 100 10 int c 100 10 int dp 1...