hdu1248 寒冰王座(完全背包)

本题可以用完全背包做,但感觉背包就是大材小用。背包是指不同大小和价值的物品放入固定容量背包所得的最大价值,注意有两个变量。而本题只是衡量价值。为一个变量,所以暴力也可以。

暴力法:

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int N = 1005;

int main()
{
  //  freopen("in.txt", "r", stdin);
    int T, i, j, k, n, num, maxx, a, b, c;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        a = n / 150;
        b = n / 200;
        c = n / 350;
        maxx = 0;
        for(i = 0; i <= a; i ++)
            for(j = 0; j <= b; j ++)
                for(k = 0; k <= c; k ++)
                {
                    num = i * 150 + j * 200 + k * 350;
                    if(num <= n) maxx = max(maxx, num);
                }
        printf("%d\n", n - maxx);
    }
    return 0;
}


背包法:

把两个数组合并成一个即可,既然已给出物品价格,所以打表,最后第一个for遍历3次即可。注意数组开小现实的是超时而不是WA。

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int N = 10005;

int main()
{
  //  freopen("in.txt", "r", stdin);
    int T, i, j, n, ans[N];
    int val[3] = {150, 200, 350};
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        memset(ans, 0, sizeof(ans));
        for(i = 0; i < 3; i ++)
            for(j = val[i]; j <= n; j ++)
                ans[j] = max(ans[j], ans[j - val[i]] + val[i]);
        printf("%d\n", n - ans[n]);
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值