庆功会
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。
Input
输入第一行为T,表示数据组数,对于每组数据的第一行二个数n(n<=500),m(m<=6000),其中n代表希望购买的奖品的种数,m表示拨款金额。
接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和购买的数量(买0件到s件均可),其中v<=100,w<=1000,s<=10。
接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和购买的数量(买0件到s件均可),其中v<=100,w<=1000,s<=10。
Output
对于每组数据输出一个数,表示此次购买能获得的最大的价值(注意!不是价格)。
Sample Input
1 5 1000 80 20 4 40 50 9 30 50 7 40 30 6 20 20 1
Sample Output
1040
/*多重背包*/
#include <stdio.h>
#include <string.h>
int dp[7000];
struct ss
{
int v,w,s;
} date[1050];
int main ()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for( int i=0; i<n; i++)
{
scanf("%d%d%d",&date[i].v,&date[i].w,&date[i].s);
}
for( int i=0; i<n; i++)
for( int j=1; j<=date[i].s; j++)
for( int k=m; k-j*date[i].v>=0; k--)
if(dp[k-date[i].v]+date[i].w>dp[k])
dp[k]=dp[k-date[i].v]+date[i].w;
printf("%d\n",dp[m]);
}
return 0;
}
/*多重背包*/
#include <stdio.h>
#include <string.h>
int dp[7000];
struct ss
{
int v,w,s;
} date[1050];
int main ()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for( int i=0; i<n; i++)
{
scanf("%d%d%d",&date[i].v,&date[i].w,&date[i].s);
}
for( int i=0; i<n; i++)
for( int j=1; j<=date[i].s; j++)
for( int k=m; k-j*date[i].v>=0; k--)
if(dp[k-date[i].v]+date[i].w>dp[k])
dp[k]=dp[k-date[i].v]+date[i].w;
printf("%d\n",dp[m]);
}
return 0;
}