寒假回家第一题:这几天忙家务. o(-)_(-)o,然后累了不睡觉,竟然看电视剧,然后又无聊看不下去,每天不切题真心不习惯了,有点痒...
题意:Iserlohn 准备收集自己喜欢的运动鞋.呵呵.Iserlohn 有m 钱,然后准备去买k个品牌的运动鞋,对于每种品牌的鞋子,Iserlohn 至少要买一双,现在求Iserlohn 能买到的运动鞋子的最大价值是多少.
思路:分组背包(每组至多选一件)的延伸,这里是每组至少选一件物品
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int brands[105],cost[105],weight[105];
int inf=-99999999;
int dp[15][10005];//i:types brands j:money
int n,m,t;//n:groups,m:money,k:types brands
void init()
{
for(int j=0;j<=m;j++)//这样的初始化是应付花费有0的情况
{
dp[0][j]=0;
}
for(int i=1;i<=t;i++)
for(int j=0;j<=m;j++)
{
dp[i][j]=inf;
}
}
void fn()
{
for(int i=1;i<=t;i++)
for(int k=0;k<n;k++)
for(int j=m;j>=cost[k];j--)
if(brands[k]==i)
{
dp[i][j]=max(dp[i][j],max(dp[i][j-cost[k]]+weight[k],dp[i-1][j-cost[k]]+weight[k]));
//状态方程
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&brands[i],&cost[i],&weight[i]);
}
init();
fn();
if(dp[t][m]<0)
printf("Impossible\n");//判断为!=0的时候.wa了..
else
printf("%d\n",dp[t][m]);
}
//system("pause");
return 0;}
453



被折叠的 条评论
为什么被折叠?



