- import java.util.Scanner;
- /**
- * 【题目描述】
- * xn 的朋友 kelly 快要过生日了,他想买一件礼物送给 kelly ,现在他手上有面值
- * 1元、5元、10元、20元、50元、100元的钞票若干,但不幸的是收银员没有足够的现金
- * 用来找钱。xn 能不能用他手上的钱凑出与他想要的礼物价值一样的面值出来呢。
- *
- * 【输入】
- * 输入第一行是一个数 n ,表示样例数目(n <= 100)。
- * 下面 n 行,每行 7 个数:v1,v2,v3,v4,v5,v6,vp,分别表示1元、5元、10元、20元、
- * 50元和100元的张数,最后的 vp 表示 xn 想要购买的礼物的价格。
- * (0 <= v1,v2,v3,v4,v5,v6 <=10, 0 < vp <= 1000)
- *
- * 【输出】
- * 对于每组数据输出一行,如果 xn 能用他手上的钱凑出与礼物价格相等的钱数,输出 yes ,
- * 否则输出 no 。
- *
- * 【样例出入】
- * 2
- * 1 1 1 1 1 1 30
- * 1 0 0 1 0 1 90
- *
- * 【样例输出】
- * yes
- * no
- *
- */
- public class D {
- /**
- * @param args
- */
- public static void main(String[] args) {
- int[] v = { 1, 5, 10, 20, 50, 100 };// 面值
- int[] m = { 0, 0, 0, 0, 0, 0 };// 凑完后各面值对应的数量
- Scanner sc = new Scanner(System.in);
- int r = sc.nextInt();// 测试用例数
- for (int k = 0; k < r; k++) {
- int[] n = new int[7];// 用于存储一行测试用例
- // 从控制台读入测试用例
- for (int i = 0; i < 7; i++) {
- n[i] = sc.nextInt();
- }
- int vp = n[6]; // 剩余价值
- for (int i = 5; i >= 0; i--) {
- if (vp >= v[i] * n[i]) {
- // 如果剩余价值大于或者等于现有面值i的总价值
- m[i] = n[i];// 记录所需面值i的钱的数量
- vp = vp - v[i] * n[i];// 重新计算剩余价值
- } else if (vp < v[i] * n[i]) {
- // 如果剩余价值小于现有面值i的总价值
- m[i] = vp / v[i];// 记录所需面值i的钱的数量
- vp = vp - v[i] * (vp / v[i]);// 重新计算剩余价值
- }
- if (vp == 0) {
- // 如果剩余价值为0,也就是说凑够了
- break;// 跳出
- }
- }
- if (vp == 0) {
- System.out.println("yes");
- for (int i = 0; i < 6; i++) {
- System.out.println(v[i] + "元:" + m[i]);
- }
- } else {
- System.out.println("no");
- }
- }
- }
- }
一道算法题:(背包,贪心,动态规划)
最新推荐文章于 2022-09-28 16:08:59 发布