完全背包水题HDU1114

本文介绍了一种解决存钱罐问题的方法,通过输入空罐子的重量、最大装载量及各种硬币的重量和价值,利用动态规划算法确定罐内最小金额。代码实现了这一逻辑并展示了具体操作。

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

题意:存钱罐可以往里面放一些价值小的钱,但是时间久了就不知道里面有多少钱了,除非你打破它。现在给出空罐子的重量和最满能装到多重,然后给出每种硬币的价值和重量,我们要在不打破它的情况下确认罐子里有多少钱。

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;


class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int T = scanner.nextInt();
for (int k = 0; k < T; k++) {
int n = scanner.nextInt();
int m = scanner.nextInt();
int t = scanner.nextInt();
int w[] = new int[t];
int p[] = new int[t];
for (int i = 0; i < t; i++) {
p[i] = scanner.nextInt();
w[i] = scanner.nextInt();


}


int f[] = bao(m - n, w, p);
if (f[f.length - 1] == 9999999) {
System.out.println("This is impossible.");
} else {
System.out.println("The minimum amount of money in the piggy-bank is " + f[f.length - 1] + ".");
}


}
}
}


public static int[] bao(int m, int[] w, int[] p) {
int f[] = new int[m + 1];
Arrays.fill(f, 9999999);//先装满
f[0] = 0;
for (int i = 0; i < p.length; i++) {
for (int j = w[i]; j < f.length; j++) {
f[j] = Math.min(f[j], f[j - w[i]] + p[i]);
}
}
return f;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值