限定數量的01揹包

Description
農大ACM校隊暑假培訓終於結束了,大家很興奮,爲此想一起聚餐慶祝一下。大家一共帶了S money去了一家餐廳。這家餐廳共有m道不同的菜可點。由於口味各不相同,所以定了個這麼點菜規則:每人點一道菜,且不能點相同的菜,直到所有人都點完或者所剩的錢不夠去再點新的一道菜。現在就讓你來計算一下最多可能的花費。 
       
Input
輸入多組測試數據,每組第一行爲三個正整數,n,m,s分別代表這次晚餐總人數,餐廳可點的菜數,以及共帶去的錢數。接下去一行m個數,分別描述每道菜的價格,也都爲正整數。n≤20 , m≤50 , s≤1000
Output
每個測試數據一行,本次聚餐可能的最高消費。
Sample Input
10 15 100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2 6 25
2 3 4 5 6 24
Sample Output
100
24

#include<iostream>
#include <cstring>
#include<cmath>
using namespace std;
int main()
{
    int n,m,s,a[60],dp[1020];
    while(cin>>n>>m>>s)
    {
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=0;i<m;i++)
            cin>>a[i];
        for(int i=0;i<m;i++)
        {
            for(int j=s;j>=a[i];j--)
            {
                if(dp[j-a[i]])
                {
                    if(!dp[j]&&j==a[i])
                        dp[j]=1;
                    else if(!dp[j]||dp[j]>=dp[j-a[i]])
                        dp[j]=dp[j-a[i]]+1;
                }
            }
        }
        for(int i=s;i>=0;i--)
        {
            if(dp[i]&&dp[i]<=n)
            {
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

發佈了28 篇原創文章 · 獲贊 17 · 訪問量 6024
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章