1. 程式人生 > >HDU 2546 飯卡( 01揹包 )

HDU 2546 飯卡( 01揹包 )

這是一道簡單的01揹包

題意:給你N種菜的價錢,給你一個初始的錢數,問你做多能花費多少

但是注意一個條件,當身上的錢>=5時,可以購買任何價錢的菜,如果<5則不能購買任何價錢的菜

                                                 飯卡

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5669    Accepted Submission(s): 1911


Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於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 <iostream>
using namespace std;
#define inf 1005
int dp[inf],cost[inf];
int n,money;

int main()
{
    while( scanf("%d",&n) == 1 && n ){
           int Max = 0 , pos;
           for( int i=1 ; i<=n ; i++ ){
                scanf("%d",&cost[i]);
                if( cost[i] > Max ){
                    pos = i ; Max = cost[i];    
                }     
           }
           scanf("%d",&money);
           if( money < 5 )
               printf("%d\n",money);
           else{
                memset( dp , 0 , sizeof(dp) );    //轉化問題
                                                  //把剩下多少錢轉化為最多可以消費多少錢
                                                  //用最初的錢減去最大花費即為剩下最少的錢 
                for( int i=1 ; i<=n ; i++ ){    
                     if( i != pos )
                         for( int v=money-5 ; v>=cost[i] ; v-- ){
                              dp[v] = max( dp[v] , dp[v-cost[i]]+cost[i] );     
                         }    
                }     
                printf("%d\n",money-dp[money-5]-Max);
           }
    }    
    return 0;
}

相關推薦

HDU 2546 01揹包

這是一道簡單的01揹包 題意:給你N種菜的價錢,給你一個初始的錢數,問你做多能花費多少 但是注意一個條件,當身上的錢>=5時,可以購買任何價錢的菜,如果<5則不能購買任何價錢的菜                                        

hdu-254601揹包

飯卡Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission

HDU 2546 01揹包

題意分析:01揹包 AC_CODE int n; int v[1002] , money; int dp[1002]; int main() { while(cin >> n && n) { int i , j

HDU 2546 01揹包

Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購

HDU 2546 ……01揹包+條件

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int

hdu 2546 01揹包+貪心

題目分析:要想使剩餘額最小,就要在就要用V=m-5的錢去買最多的菜,再用剩下的5元買最貴的菜; 先對菜價按升序排序,再用V買前i-1件 物品, #include<iostream> #include<cstdio> #include<algo

2546 01揹包

演算法:01揹包DP 難度:NOIP--- 先把最貴的一種菜找到不用,用剩餘金額減5的金錢去儘可能買 除掉最貴的菜後剩餘的菜類, 最後再用餘下的錢去買最貴的菜 注意:要特判m<5的

hdu 2546 01揹包+貪心)

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25615 Accepted Submi

杭電 2546 01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。 某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜的價格以及卡上的餘額,問最

HDU 254601揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41634    Accepted Submission(

題解報告:hdu 2546 01背包

set div input 解題思路 結束 hdu 2546 代碼 sizeof 以及 Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷余額。如果購買一個商品之前,卡上的剩余金額大於或等於5元,就一定可以購買成功(即使購買後

2546 01揹包,挺好的

題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:剛開始直接把揹包的容量搞為m-5+max1(max1的值為最貴的菜的價格),因為他最多的能花這麼多,結果錯了,應該把最大的單獨提出來,用5塊來買,剩下的錢做揹包 A

01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。 某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜的價格以

hdu2546:01揹包

http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額

HDU 254601揹包水題】

先上題 Problem Description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡

hdu_2546_01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。 某天,食堂中有n種菜出售,每

hdu 2546 貪心+01揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi

HDU 2602 Bone Collector01揹包

Bone Collector   Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , s

HDU 2602 - Bone Collector01揹包

題目連結 http://acm.hdu.edu.cn/showproblem.php?pid=2602 【思路】 01揹包問題 #include<bits/stdc++.h> using namespace std; const int maxn=1005; int

hdoj 2546 01揹包

飯卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16638    Accepted Submission(