不化为01背包情况
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
static int dp[105][105];//前i种物品价格为j的时候总重量
static int p[105],h[105],c[105];
int main()
{
int C;
scanf("%d",&C);
while(C--)
{
int n,m;
scanf("%d %d",&n,&m);
for (int i=1;i<=m;++i)
scanf("%d %d %d",&p[i],&h[i],&c[i]);
memset(dp,0,sizeof(dp));
int ans = 0;
for (int i=1;i<=m;++i)
{
for (int j=0;j<=n;++j)
{
for (int k=0;k<=c[i];++k)
{
if (j>=k*p[i])
{
dp[i][j] = max(dp[i-1][j-k*p[i]]+k*h[i],dp[i][j]);
}
}
ans = max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return 0;
}
化为01背包:
//化为01背包
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
static int dp[2010];//前i种物品价格为j的时候总重量
static int p[2010],h[2010];
int main()
{
int C;
scanf("%d",&C);
while(C--)
{
int n,m;
int cs = 0;
scanf("%d %d",&n,&m);
int c;
int p1,h1;
for (int i=1;i<=m;++i){
scanf("%d %d %d",&p1,&h1,&c);
for (int j=1;j<=c;++j)
{
p[cs+j] = p1;h[cs+j] = h1;
}
cs+=c;
}
memset(dp,0,sizeof(dp));
int ans = 0;
for (int i=1;i<=cs;++i)
{
for (int j=n;j>=p[i];--j)
{
dp[j] = max(dp[j],dp[j-p[i]]+h[i]);
ans = max(ans,dp[j]);
}
}
printf("%d\n",ans);
}
return 0;
}