#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define max(a,b) a>b?a:b
float temp[100]={0};
int dp[100][100]={0};
int d[100]={0};
using namespace std;
//例1:
//n=5 c=10
//w=2,2,6,5,4
//v=6,3,5,4,6
//输出15
//例2:
//n=4 c=5
//wi vi si
//1 2 3
//2 4 1
//3 4 3
//4 5 2
//输出10
//0-1背包问题 (n种物品,每种只有一个,容量为c,每个物品放入或不放入背包)
//dp[i][j]表示从第1~i物品(前i个物品)选择放入容积为j时的最大收益
void Bagproblem(int *w,int *v,int n,int c)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=c;j++)
{
dp[i][j]=dp[i-1][j];
if(j>=w[i])
{
dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][c]);
}
//0-1背包问题 空间优化
// void Bagproblem(int *w,int *v,int n,int c)
// {
// for(int i=1;i<=n;i++)
// {
// for(int j=c;j>=w[i];j--)//从大到小循环,而从大到小算的话一定用的是上一层的状态
// {
// d[j]=max(d[j],d[j-w[i]]+v[i]);
// }
// }
// printf("%d\n",d[c]);
// }
//完全背包(n种物品,每种物品无线个,背包容量为c) 求最大价值
void ComBackpack(int *w,int *v,int n,int c)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=c;j++)
{
dp[i][j]=dp[i-1][j];
if(j>=w[i])
{
dp[i][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][c]);
}
//完全背包问题的空间优化
// void ComBackpack(int *w,int *v,int n,int c)
// {
// for(int i=1;i<=n;i++)
// {
// for(int j=w[i];j<=c;j++)
// {
// d[j]=max(d[j],d[j-w[i]]+v[i]);
// }
// }
// printf("%d\n",d[c]);
// }
//多重背包(n种物品,第i个物品为Si个,背包容量为c) 求最大价值
//是0-1背包的延伸
void MultipleBackpack(int *w,int *v,int *s,int n,int c)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=c;j++)
{
for(int k=1;k<=s[i] && k*w[i]<=j;k++)
{
dp[i][j]=dp[i-1][j];
if(j>=w[i])
{
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);
}
}
}
}
printf("%d\n",dp[n][c]);
}
//多重背包问题的空间优化
// void MultipleBackpack(int *w,int *v,int *s,int n,int c)
// {
// for(int i=1;i<=n;i++)
// {
// for(int j=c;j>=w[i];j--)//从大到小循环,而从大到小算的话一定用的是上一层的状态
// {
// for(int k=1;k<=s[i] && k*w[i]<=j;k++)
// {
// d[j]=max(d[j],d[j-k*w[i]]+k*v[i]);
// }
// }
// }
// printf("%d\n",d[c]);
// }
int main()
{
int x,y;
cin>>x>>y;
int w[x+1];
int v[x+1];
int s[x+1];
// for(int i=1;i<=x;i++)
// {
// cin>>w[i]>>v[i];
// }
// Bagproblem(w,v,x,y);
// ComBackpack(w,v,x,y);
for(int i=1;i<=x;i++)
{
cin>>w[i]>>v[i]>>s[i];
}
MultipleBackpack(w,v,s,x,y);
}
背背背包包包问题(0-1背包、完全背包、多重背包)
最新推荐文章于 2025-05-30 16:02:21 发布