https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ffc7/00000000001d40bb
题目大意:小明有
n
n
n堆盘子,每堆盘子有
k
k
k个,每个盘子有一个美丽值,按照从顶部到底部的顺序给出,现在你可以选取
P
P
P个盘子,且如果你选了某一堆的某一个盘子,则这个盘子上面的盘子也要同时选择,问能获得的最大美丽值。
思路:将每一堆盘子抽象成 k k k个不同的物品,那么一共有 n n n组物品,且每组物品最多选 1 1 1个。这不就是分组背包嘛。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int w[2005],v[2005],dp[2005];
int main()
{
int t,n,k,p,times=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&k,&p);
memset(dp,0,sizeof(dp));
int len=0,tmp,sum;
for(int i=0;i<n;i++)
{
sum=0;
for(int j=1;j<=k;j++)
{
scanf("%d",&tmp);
sum+=tmp;
w[++len]=j;
v[len]=sum;
}
}
for(int i=1;i<=len;i+=k)
{
for(int j=p;j>=0;j--)
{
for(int x=i;x<i+k;x++)
{
if(j>=w[x])
dp[j]=max(dp[j],dp[j-w[x]]+v[x]);
else
break;
}
}
}
printf("Case #%d: %d\n",++times,dp[p]);
}
return 0;
}