动归里的完全背包问题》。。。。
每个电子货币都有两种价值,x,y,题目要求用最少的硬币来凑成价值s。
代码如下:
#include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; #define MAX 305 #define INF 0x7fffffff int m, n, s, a[45][2], dp[MAX][MAX]; int main() { scanf("%d",&n); while(n--) { scanf("%d%d",&m,&s) ; for(int i = 0; i < m; i++) scanf("%d %d",&a[i][0],&a[i][1]); for(int i = 0; i <= s; i++) for(int j = 0; j <= s; j++) dp[i][j] = INF; int ans = INF; dp[0][0] = 0; for(int i = 0; i < m; i++) { int x = a[i][0], y = a[i][1]; for(int j = x; j <= s; j++) { for(int k = y; k <= s; k++) { if(dp[j-x][k-y]!=INF) dp[j][k] = min(dp[j][k], dp[j-x][k-y]+1); } } } for(int i = 0; i <= s; i++) for(int j = 0; j <= s; j++) if(dp[i][j]!=INF&&i*i+j*j==s*s&&ans>dp[i][j]) ans = dp[i][j]; if(ans==INF) puts("not possible"); else printf("%d\n",ans); } return 0; }