X - 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活【含多重背包转01背包的模板】
[by_041]
(前段时间比较有事做,好久莫得刷题,手都快生了,不对劲,回来刷刷)
题目理解
- 这题是道裸的多重背包模板题:物品有
价格
、价值
、数量
,将其用01背包的做法做的代码模板如下:
int n; // 有的资金
int m; // 商品个数
struct goods_ // 产品信息
{
int price,value,number;
}g[M_max+1];
int dp[N_max+1]; //dp[i]表示用i元能得到的最多的产品价值
... // 输入部分,下标都从1开始
for(int i=1;i<=m;i++)
{
for(int j=g[i].number;j;j--)
{
for(int k=n-g[i].price;~k;k--)
{
dp[k+g[i].price]=maxx(dp[k+g[i].price],dp[k]+g[i].value);
}
}
}
printf("%d\n",dp[n]); // 输出最大价值
然后就是AC码了:
#include<cstdio>
int maxx(int a,int b)
{
return a>b?a:b;}
struct rice_
{
int price,heavy,contain;
}r[111];
int dp[107]; //dp[i]表示用i元能买到的最大大米数量
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
dp[i]=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&r[i].price,&r[i].heavy,&r[i].contain);
}
// for(int i=1;i<=m;i++)
// printf("%d %d %d\n",r[i].price,r[i].heavy,r[i].contain);
for(int i=1;i<=m;i++)
{
for(int j=r[i].contain;j;j--)
{
for(int k=n-r[i].price;~k;k--)
{
dp[k+r[i].price]=maxx(dp[k+r[i].price],dp[k]+r[i].heavy);
}
}
}
// for(int i=0;i<=n;i++)
// printf("dp[%2d ] : %d\n",i,dp[i]);
printf("%d\n",dp[n]);
}
return 0;
}