豬儲錢罐空重 E、滿重 F,硬幣 N 種,每種有面值 P 和重量 W。求總重量恰好為 F-E 時的最小面值總和。不可行輸出 This is impossible.。
dp[w]:重量恰好為 w 的最小面值。初始 dp[0]=0,其余 INF。for w=W..V: dp[w] = min(dp[w], dp[w-W]+P)。dp[V] (V=F-E),若仍為 INF 則不可能。#include <iostream>
#include <cstring>
#define MAXV 10005
#define INF 0x3f3f3f3f
int dp[MAXV];
int main() {
int T; cin >> T;
while (T--) {
int E, F, N; cin >> E >> F >> N;
int V = F - E;
fill(dp, dp+V+1, INF); dp[0] = 0;
for (int i=0; i> P >> W;
for (int w=W; w<=V; w++)
if (dp[w-W] != INF) dp[w] = min(dp[w], dp[w-W]+P);
}
if (dp[V] == INF) cout << "This is impossible." << endl;
else cout << "The minimum amount of money in the piggy-bank is " << dp[V] << "." << endl;
}
return 0;
}
w 從小到大(可重複使用)。V ≤ 10000,N ≤ 500,O(NV) = 5×10⁶ 極快。