hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (背包问题)
生活随笔
收集整理的這篇文章主要介紹了
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (背包问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
悼念512汶川大地震遇難同胞——珍惜現在,感恩生活
Time Limit : 1000/1000ms (Java/Other)???Memory Limit : 32768/32768K (Java/Other)
Problem Description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心系災區同胞的你準備自己采購一些糧食支援災區,現在假設你一共有資金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 解題思路:這是一個多重背包問題,但是我們可以通過轉化把它轉化為0-1背包。與0-1背包相比,這種多重背包就比0-1背包多了每種大米的袋數,我們只需要把這幾袋大米看作不同的大米,對袋數循環一下,即加一個袋數循環,就轉化為了0-1背包。 下面是用一維滾動數組寫的AC代碼: #include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b;
struct dami
{
? ? int w,c,p;
}a[105];
int dp[105];
int main()
{
? ? int t,i,max,k,j,n,m;
? ? scanf("%d",&t);
? ? while(t--)
? ? {
????? ? scanf("%d%d",&n,&m);
????? ? for(i=0;i<m;i++)
??????? ? scanf("%d%d%d",&a[i].p,&a[i].w,&a[i].c);
????? ? memset(dp,0,sizeof(dp));
????? ? for(i=0;i<m;i++)
?????? ? for(j=1;j<=a[i].c;j++) ?//加一個袋數循環
?????????? ? for(k=n;k>=a[i].p;k--)
??????????? ? dp[k]=max(dp[k],dp[k-a[i].p]+a[i].w);
?????? ? printf("%d\n",dp[n]);
? ? }
? ? return 0;
}
用二進制優化后的代碼如下: #include<stdio.h>
#include<string.h>
int dp[102];
int main()
{
int i,j,n,t,m;
int value[1020],size[1020],p[102],v[102],c[102];
scanf("%d",&t);
while(t--)
{
int count=0;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&p[i],&v[i],&c[i]);
? ?for(j=1;j<=c[i];j<<=1)
{
? ? ? ? ? ? ? ? value[count]=j*v[i];
size[count++]=j*p[i];
c[i]-=j;
}
if(c[i]>0)
{
value[count]=c[i]*v[i];
size[count++]=c[i]*p[i];
}
}
memset(dp,0,sizeof(dp));
for(i=0;i<count;i++)
for(j=n;j>=size[i];j--)
if(dp[j]<dp[j-size[i]]+value[i])
dp[j]=dp[j-size[i]]+value[i];
printf("%d\n",dp[n]);
}
return 0;
}
總結
以上是生活随笔為你收集整理的hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (背包问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微服务开发的 10 个最佳实践
- 下一篇: 被裁半年后进大厂,他咋做到的?