HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
生活随笔
收集整理的這篇文章主要介紹了
HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
悼念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 2Sample Output
400思路
題意可得,這是一個多重背包問題,有兩種方法1 類似于完全背包的思想,只是這里的數量不再是無限個,而是有限個,然后利用三重循環就可以解,狀態轉移方程為 dp[j]=max(dp[j],dp[j-k*val[i]]+k*w[i]);2 轉換為0 1背包問題來解,即我們把第i件物品分成若干分,使得能用取這若干份的物品來代替取第i件物品的情況,我們把第i件物品的數量分為2^0,2^1,2^2....2^(k-1),number-2^k+1;這樣分也能保證每個數量的物品都能被分成不同的份數來代替,最多這個問題就變成了0 1背包問題,狀態轉移方程: dp[j]=max(dp[j],dp[j-s[i]]+w[i]);代碼
第一種方法
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm>using namespace std; int dp[110]; int val[110],num[110],w[110];int main(){int t;scanf("%d",&t);while(t--){int n,m;scanf("%d %d",&m,&n);for(int i=1;i<=n;++i)scanf("%d %d %d",&val[i],&w[i],&num[i]);memset(dp,0,sizeof(dp));for(int i=1;i<=n;++i)for(int j=m;j>=val[i];j--)for(int k=1;k<=num[i];++k)if(j>=k*val[i])dp[j]=max(dp[j],dp[j-k*val[i]]+k*w[i]);printf("%d\n",dp[m]);}return 0; }第二種,二進制優化
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring>using namespace std; int dp[110]; int s[1000],w[1000];int main(){int n,m,t;scanf("%d",&t);while(t--){scanf("%d %d",&m,&n);int x;int k=0;while(n--){int p,c,h;scanf("%d %d %d",&p,&h,&c);int x=1;while(c>=x){s[++k]=x*p;w[k]=x*h;c-=x;x*=2;}s[++k]=p*c;w[k]=c*h;}memset(dp,0,sizeof(dp));for(int i=1;i<=k;++i)for(int j=m;j>=s[i];--j)dp[j]=max(dp[j],dp[j-s[i]]+w[i]);printf("%d\n",dp[m]);}return 0; }總結
以上是生活随笔為你收集整理的HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冗余是什么
- 下一篇: P3369 (Splay树模板)