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

hdu-2546飯卡(01揹包)

飯卡

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


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

Input多組資料。對於每組資料:
第一行為正整數n,表示菜的數量。n<=1000。
第二行包括n個正整數,表示每種菜的價格。價格不超過50。
第三行包括一個正整數m,表示卡上的餘額。m<=1000。

n=0表示資料結束。

Output對於每組輸入,輸出一行,包含一個整數,表示卡上可能的最小余額。
Sample Input1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
Sample Output-45 32
原題

01揹包問題,首先拿出5元買最貴的東西,那接下來就是揹包容量m-5,物品數量n-1 的01揹包問題了。

狀態轉移方程為f[j]=max(f[j],f[j-price[i]]+price[i]) , f[j]表示買前i件物品,預算為j時的最大花銷 

為了好弄,我把最貴的移到陣列尾部。

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int cmp(int a,int b){
    return a<b;
}
int main(int argc, char *argv[])
{
    int n,V,dp[1111];
    int v[1111],price[1111];
    while(cin>>n){
        if(n==0) break;
        int i,j;
        for(i=0;i<n;i++) cin>>v[i];
        cin>>V;
        if(V<5) {
            cout<<V<<endl;
            continue;
        }
        int ma=0,num;
        sort(v,v+n,cmp);
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++) price[i]=v[i];
        V-=5;
        for(i=0;i<n-1;i++){
            for(j=V;j-v[i]>=0;j--){
                if(dp[j]<dp[j-v[i]]+price[i]) dp[j]=dp[j-v[i]]+price[i];
            }
        }
        cout<<V+5-dp[V]-price[n-1]<<endl;
    }
    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(