码迷,mamicode.com
首页 > 其他好文 > 详细

uva10306-电子硬币

时间:2016-09-15 13:34:23      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

题目链接 http://vjudge.net/problem/19449

 

解题思路

无限背包。。。求最短路咯。。。

 

代码

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 310
#define MAX_NUM 1E9
struct point {
    int x, y;
};
int dp[MAX_SIZE][MAX_SIZE];
bool vis[MAX_SIZE][MAX_SIZE];
point ecoin[50];
int main()
{
    int tests;
    int m, s;
    scanf("%d", &tests);
    while(tests--) {
        scanf("%d%d", &m, &s);
        for(int i=0; i<m; i++) scanf("%d%d", &ecoin[i].x, &ecoin[i].y);
        for(int i=0; i<MAX_SIZE; i++) for(int j=0; j<MAX_SIZE; j++) dp[i][j] = MAX_NUM;
        memset(vis, 0, sizeof(vis));
        dp[0][0] = 0; vis[0][0] = true;
        for(int i=0; i<=s; i++)
            for(int j=0; j<=s; j++)
                for(int k=0; k<m; k++) if(i+ecoin[k].x <= s && j+ecoin[k].y <= s)
                    if(vis[i][j] && dp[i][j] + 1 < dp[i+ecoin[k].x][j+ecoin[k].y]) 
                    {
                        vis[i+ecoin[k].x][j+ecoin[k].y] = true;
                        dp[i+ecoin[k].x][j+ecoin[k].y] = dp[i][j] + 1;
                    }
        int minV = MAX_NUM;
        for(int i=0; i<=s; i++)
            for(int j=0; j<=s; j++) if(i * i + j * j == s * s && dp[i][j] < minV) minV = dp[i][j];
        if(minV == MAX_NUM) printf("not possible\n");
        else printf("%d\n", minV);
    }
    return 0;
}

 

uva10306-电子硬币

标签:

原文地址:http://www.cnblogs.com/ZengWangli/p/5874646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!