uva10306-电子硬币

题目链接 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;
}

 

posted @ 2016-09-15 12:47  啊嘞  阅读(207)  评论(0编辑  收藏  举报