悼念512汶川大地震遇難同胞——珍惜現在,感恩生活(部分背包)


急!災區的食物依然短缺! 
為了挽救災區同胞的生命,心系災區同胞的你准備自己采購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大米,每種大米都是袋裝產品,其價格不等,並且只能整袋購買。 
請問:你用有限的資金最多能采購多少公斤糧食呢? 

后記: 
人生是一個充滿了變數的生命過程,天災、人禍、病痛是我們生命歷程中不可預知的威脅。 
月有陰晴圓缺,人有旦夕禍福,未來對於我們而言是一個未知數。那么,我們要做的就應該是珍惜現在,感恩生活—— 
感謝父母,他們給予我們生命,撫養我們成人; 
感謝老師,他們授給我們知識,教我們做人 
感謝朋友,他們讓我們感受到世界的溫暖; 
感謝對手,他們令我們不斷進取、努力。 
同樣,我們也要感謝痛苦與艱辛帶給我們的財富~ 

Input

輸入數據首先包含一個正整數C,表示有C組測試用例,每組測試用例的第一行是兩個整數n和m(1<=n<=100, 1<=m<=100),分別表示經費的金額和大米的種類,然后是m行數據,每行包含3個數p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分別表示每袋的價格、每袋的重量以及對應種類大米的袋數。

Output

對於每組測試數據,請輸出能夠購買大米的最多重量,你可以假設經費買不光所有的大米,並且經費你可以不用完。每個實例的輸出占一行。

Sample Input

1
8 2
2 100 4
4 100 2

Sample Output

400
題目分析:
外循環i大米種類,中間循環j經費,內循環k該大米數量,遞推式即為:dp[j]=max(dp[j],dp[j-p[i]*k]+h[i]*k)。
#include <iostream>
#include <cstring>
using namespace std;
int p[105],h[105],c[105],dp[105];
int n,m;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(dp,0,sizeof dp);
        cin>>n>>m;
        for(int i=1;i<=m;i++)
            cin>>p[i]>>h[i]>>c[i];
        for(int i=1;i<=m;i++)
            for(int j=n;j>=0;j--)
                for(int k=1;k<=c[i];k++)
                    if(j>=p[i]*k) dp[j]=max(dp[j],dp[j-p[i]*k]+h[i]*k);
        cout<<dp[n]<<'\n';
    }
    return 0;
}
 
        

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM