zoukankan      html  css  js  c++  java
  • hdu 2546 饭卡-动态规划(基础中的基础题)

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,
    卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购
    买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售,每
    种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 


    Input:

    多组数据。对于每组数据:
    第一行为正整数n,表示菜的数量。n<=1000。
    第二行包括n个正整数,表示每种菜的价格。价格不超过50。
    第三行包括一个正整数m,表示卡上的余额。m<=1000。
    
    n=0表示数据结束。 

    Output:

    对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。

    Sample Input:
    1
    50
    5
    10
    1 2 3 2 1 1 2 3 2 1
    50
    0

    Sample Output:
    -45
    32

    思路:

    没啥可说的,直接代码:

    #include<stdio.h>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    
    using namespace std;
    
    int board[1005];
    int dp[1005];
    
    int main()
    {
    	int n;
    
    	while(scanf("%d",&n)&&n)
    	{
    		memset(dp,0,sizeof(dp));
    		
    		for(int i=0 ; i<n ; i++)scanf("%d",&board[i]);
    		
    		sort(board,board+n);
    		
    		int yue;                 //yue是余额 
    		scanf("%d",&yue);
    		
    		if(yue<5)
    		{
    			printf("%d
    ",yue);
    			continue;
    		}
    
    		yue -= 5;
    
    		for(int i=0 ; i<n-1 ; i++)
    		{
    			for(int j=yue ; j>=board[i] ; j--)
    			{
    				dp[j] = max(dp[j],dp[j-board[i]]+board[i]);
    			}
    		}
    		
    		printf("%d
    ",yue+5-dp[yue]-board[n-1]);
    	}
    
    	return 0;
    }


  • 相关阅读:
    DirectX11 With Windows SDK--14 深度测试
    DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
    DirectX11--深入理解HLSL常量缓冲区打包规则
    JS学习笔记7_表单脚本
    JS学习笔记6_事件
    JS学习笔记5_DOM
    JS学习笔记4_BOM
    JS学习笔记3_函数表达式
    JS学习笔记2_面向对象
    JS学习笔记1_基础与常识
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514288.html
Copyright © 2011-2022 走看看