UVA - 10306 e-Coins

来源:互联网 发布:现货白银看盘软件 编辑:程序博客网 时间:2024/05/24 03:24

题意:给你n个硬币,每个硬币有两个值x,y,求最少的组合使得(x1+x2..)^2 + (y1+y2...)^2 = m^2,令dp[i][j]代表凑出x总和为i,y总和为j的最少组合,然后就是找出最小的满足要求,不知道为什么用memset(dp,INF,sizeof(dp))会出错

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 505;const int INF = 1<<20;struct node{    int x,y;}coin[MAXN];int dp[MAXN][MAXN];int main(){    int t,n,m;    scanf("%d",&t);    while (t--){        scanf("%d%d",&n,&m);        for (int i = 0; i <= m; i++)            for (int j = 0; j <= m; j++)                dp[i][j] = INF;        for (int i = 0; i < n; i++)            scanf("%d%d",&coin[i].x,&coin[i].y);        int ans = INF;        dp[0][0] = 0;        for (int i =  0; i < n; i++){            int x = coin[i].x;            int y = coin[i].y;            for (int j = x; j <= m; j++)                for (int k = y; k <= m; 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 <= m; i++)            for (int j = 0; j <= m; j++)                if (dp[i][j] != INF && i*i+j*j == m*m && ans > dp[i][j])                    ans = dp[i][j];        if (ans == INF)            printf("not possible\n");        else printf("%d\n",ans);    }    return 0;}



原创粉丝点击