第一种转化为01背包,此代码比较简单,自己写的,结果题目在介绍 ai 和ci时的顺序跟 输入时ci ai的顺序不一样,搞的我ai ci混淆了,悲催啊,
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<memory.h>
using namespace std;
struct Node
{
int c,h,a;
}node[402];
int dp[40010];
void clear()
{
memset(dp,0,sizeof(dp));
memset(node,0,sizeof(node));
}
bool cmp(Node x,Node y)
{
return x.a<y.a;
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
clear();
for(int i=1;i<=n;i++)
scanf("%d %d %d",&node[i].h,&node[i].a,&node[i].c);
sort(node+1,node+n+1,cmp);
int maxn=0;
for(int i=1;i<=n;i++)
{
for(int k=1;k<=node[i].c;k++)//转化为0 1 背包
{
for(int j=node[i].a;j>=node[i].h;j--)//简单的01背包
{
dp[j]=max(dp[j],dp[j-node[i].h]+node[i].h);
if(maxn<dp[j])
maxn=dp[j];
}
}
}
printf("%d\n",maxn);
}
return 0;
}
接下来是多重背包的做法,可是以前做的都是知道背包容量求放入最多量,现在反而让求背包最大的容量,思维有些转变,参考目标需要自己想,此处参考了一下别人的代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<memory.h>
using namespace std;
struct Node
{
int c,h,a;
}node[402];
int dp[40010],mark[40010];
void clear()
{
memset(dp,0,sizeof(dp));
memset(node,0,sizeof(node));
}
bool cmp(Node x,Node y)
{
return x.a<y.a;
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
clear();
dp[0]=1;
for(int i=1;i<=n;i++)
scanf("%d %d %d",&node[i].h,&node[i].a,&node[i].c);
sort(node+1,node+n+1,cmp);
int maxn=0;
for(int i=1;i<=n;i++)
{
memset(mark,0,sizeof(mark));
for(int j=node[i].h;j<=node[i].a;j++)
{
if(!dp[j] && dp[j-node[i].h] && mark[j-node[i].h]+1<=node[i].c)//注意这里的转化目标思想,按照原始的多重背包来看,现在求的就是背包容量,
{
dp[j]=1;
mark[j]=mark[j-node[i].h]+1;
maxn=max(j,maxn);
}
}
}
cout<<maxn<<endl;
}
return 0;
}