HDU 5610 Baby Ming and Weight lifting

本篇介绍了一个简单的编程问题:BabyMing希望通过不同重量的杠铃盘组合成一个特定重量的平衡杠铃。文章提供了一种通过枚举算法解决此问题的方法,并给出了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

Baby Ming is fond of weight lifting. He has a barbell pole(the weight of which can be ignored) and two different kinds of barbell disks(the weight of which are respectively aa and bb), the amount of each one being infinite.

Baby Ming prepare to use this two kinds of barbell disks to make up a new one weighted CC(the barbell must be balanced), he want to know how to do it.

https://i-blog.csdnimg.cn/blog_migrate/b4b84567b13ee4486778964422b316b1.jpeg

Input

In the first line contains a single positive integer TT, indicating number of test case.

For each test case:

There are three positive integer a, ba,b, and CC.

1 \leq T \leq 1000, 0 < a, b, C \leq 1000, a \neq b1T1000,0<a,b,C1000,ab

Output

For each test case, if the barbell weighted CC can’t be made up, print Impossible.

Otherwise, print two numbers to indicating the numbers of aa and bb barbell disks are needed. (If there are more than one answer, print the answer with minimum a+ba+b)

Sample Input
2
1 2 6
1 4 5 
Sample Output
2 2

Impossible

简单枚举就可以了,我还傻乎乎的用了个背包。

#include<string>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 10;
typedef long long LL;
int T, n, m;
int a, b, c, f[maxn];

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d%d", &a, &b, &c);
        if ((c & 1) == 0)
        {
            c = c / 2;
            for (int i = 1; i <= c; i++) f[i] = -1;
            f[0] = 0;
            for (int i = 0; i <= c; i++)
            {
                if (f[i] >= 0)
                {
                    if (f[i + a] == -1) f[i + a] = f[i] + 1;
                    else f[i + a] = min(f[i + a], f[i] + 1);
                    if (f[i + b] == -1) f[i + b] = f[i] + 1;
                    else f[i + b] = min(f[i + b], f[i] + 1);
                }
            }
            if (f[c] >= 0) {
                for (int i = 0; i <= f[c]; i++)
                {
                    if (i*a + (f[c] - i)* b == c)
                    {
                        printf("%d %d\n", i*2, (f[c] - i)*2);    break;
                    }
                }
            }
            else printf("Impossible\n");
        }
        else printf("Impossible\n");
    }
    //while (scanf("%d", &n) != EOF){}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值