一道算法题:(背包,贪心,动态规划)

  1. import java.util.Scanner;  
  2. /** 
  3.  * 【题目描述】 
  4.  * xn 的朋友  kelly 快要过生日了,他想买一件礼物送给  kelly ,现在他手上有面值 
  5.  * 1元、5元、10元、20元、50元、100元的钞票若干,但不幸的是收银员没有足够的现金 
  6.  * 用来找钱。xn 能不能用他手上的钱凑出与他想要的礼物价值一样的面值出来呢。 
  7.  *  
  8.  * 【输入】 
  9.  * 输入第一行是一个数 n ,表示样例数目(n <= 100)。 
  10.  * 下面 n 行,每行 7 个数:v1,v2,v3,v4,v5,v6,vp,分别表示1元、5元、10元、20元、 
  11.  * 50元和100元的张数,最后的 vp 表示 xn 想要购买的礼物的价格。 
  12.  * (0 <= v1,v2,v3,v4,v5,v6 <=10, 0 < vp <= 1000) 
  13.  *  
  14.  * 【输出】 
  15.  * 对于每组数据输出一行,如果 xn 能用他手上的钱凑出与礼物价格相等的钱数,输出 yes , 
  16.  * 否则输出 no 。 
  17.  *  
  18.  * 【样例出入】 
  19.  * 2 
  20.  * 1 1 1 1 1 1 30 
  21.  * 1 0 0 1 0 1 90 
  22.  *  
  23.  * 【样例输出】 
  24.  * yes 
  25.  * no 
  26.  *  
  27.  */  
  28. public class D {  
  29.     /** 
  30.      * @param args 
  31.      */  
  32.     public static void main(String[] args) {  
  33.         int[] v = { 15102050100 };// 面值   
  34.         int[] m = { 000000 };// 凑完后各面值对应的数量   
  35.         Scanner sc = new Scanner(System.in);  
  36.         int r = sc.nextInt();// 测试用例数   
  37.         for (int k = 0; k < r; k++) {  
  38.             int[] n = new int[7];// 用于存储一行测试用例   
  39.             // 从控制台读入测试用例   
  40.             for (int i = 0; i < 7; i++) {  
  41.                 n[i] = sc.nextInt();  
  42.             }  
  43.             int vp = n[6]; // 剩余价值   
  44.             for (int i = 5; i >= 0; i--) {  
  45.                 if (vp >= v[i] * n[i]) {  
  46.                     // 如果剩余价值大于或者等于现有面值i的总价值   
  47.                     m[i] = n[i];// 记录所需面值i的钱的数量   
  48.                     vp = vp - v[i] * n[i];// 重新计算剩余价值   
  49.                 } else if (vp < v[i] * n[i]) {  
  50.                     // 如果剩余价值小于现有面值i的总价值   
  51.                     m[i] = vp / v[i];// 记录所需面值i的钱的数量   
  52.                     vp = vp - v[i] * (vp / v[i]);// 重新计算剩余价值   
  53.                 }  
  54.                 if (vp == 0) {  
  55.                     // 如果剩余价值为0,也就是说凑够了   
  56.                     break;// 跳出   
  57.                 }  
  58.             }  
  59.             if (vp == 0) {  
  60.                 System.out.println("yes");  
  61.                 for (int i = 0; i < 6; i++) {  
  62.                     System.out.println(v[i] + "元:" + m[i]);  
  63.                 }  
  64.             } else {  
  65.                 System.out.println("no");  
  66.             }  
  67.         }  
  68.     }  
  69. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值