ミックスバックの問題
5119 ワード
/*
Name:
Copyright:
Author:
Date: 07-06-18 09:33
Description:
: n c , P[i] W[i] i 。
(01 ), ( ), ( )
。
2 n c, n , c
n , 3 Wi,Pi Ni, i , ( Ni=0, )
,
3 10
2 1 0
3 3 1
4 5 4
11
:
0-1 , 。
Ni , 。
2 , , 1 。
, ,
, , , 。
*/
#include
#include
using namespace std;
const int MAXC = 6000; //
const int MAXN = 2000; //
int W[MAXN+1];//
int P[MAXN+1];//
int N[MAXN+1];//
int pre[MAXC+1]; //pre[j] B[i-1][j]
int cur[MAXC+1]; //cur[j] B[i][j]
int F[MAXC+1]; // c
int F2[MAXC+1]; // c
int F3[MAXC+1]; // c
int MixPack_1(int n, int c);// :2
int MixPack_2(int n, int c);// :
int MixPack_3(int n, int c);// : , ,
int MixPack_4(int n, int c);// : ,
int main()
{
int n, c;
cin >> n >> c;
for (int i=1; i<=n; i++)// 0
{
cin >> W[i] >> P[i] >> N[i];
}
cout << MixPack_1(n, c) << endl;
cout << MixPack_2(n, c) << endl;
cout << MixPack_3(n, c) << endl;
cout << MixPack_4(n, c) << endl;
return 0;
}
int MixPack_1(int n, int c)// :2
{
for (int i=1; i<=n; i++)
{
if (N[i] == 0) //
{
//cur[j] i , j
//pre[j] i-1 , j
for (int j=1; j<=c; j++)
{
if (j < W[i] || pre[j] > cur[j-W[i]] + P[i])
cur[j] = pre[j];
else
cur[j] = cur[j-W[i]] + P[i];
}
for (int j=1; j<=c; j++)
{
pre[j] = cur[j];
}
}
else // ( 0-1 )
{
//cur[j] i , j , k
//pre[j] i , j , k-1
for (int k=0; k pre[j-W[i]] + P[i])
cur[j] = pre[j];
else
cur[j] = pre[j-W[i]] + P[i];
}
for (int j=1; j<=c; j++)
{
pre[j] = cur[j];
}
}
}
}
return pre[c];
}
int MixPack_2(int n, int c)// :1
{
for (int i=1; i<=n; i++)
{
if (N[i] == 0) //
{ // j , j
for (int j=W[i]; j<=c; j++)
{// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]
if (F[j] < F[j-W[i]] + P[i])
F[j] = F[j-W[i]] + P[i];
}
}
else // ( 0-1 )
{
for (int k=0; k=W[i]; j--)
{// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]
if (F[j] < F[j-W[i]] + P[i])
F[j] = F[j-W[i]] + P[i];
}
}
}
}
return F[c];
}
int MixPack_3(int n, int c)// : , ,
{
int maxNum = 0; // i 0-1
for (int i=1; i<=n; i++)
{
maxNum = c / W[i]; // , maxNum
if (N[i] > 0 && maxNum > N[i]) //
{
maxNum = N[i];
}
for (int k=maxNum; k>0; k--)// i maxNum 0-1
{// j , j
for (int j=c; j>=W[i]; j--)
{// (j < W[i] || F[j] > F[j-W[i]] + P[i]) ,F[j]
if (F2[j] < F2[j-W[i]] + P[i])
F2[j] = F2[j-W[i]] + P[i];
}
}
}
return F2[c];
}
int MixPack_4(int n, int c)// : ,
{
int s, bestP;
int maxNum = 0; // i
for (int i=1; i<=n; i++)
{
for (int j=c; j>=W[i]; j--) // 0-1 ,j
{
// , i k , , B[i][j]
bestP = s = 0;
maxNum = c / W[i]; // , maxNum
if (N[i] > 0 && maxNum > N[i]) //
{
maxNum = N[i];
}
for (int k=maxNum; k>0; k--)
{
if (k*W[i] <= j)
{
s = F3[j-k*W[i]] + k*P[i];
if (s > bestP)
bestP = s;
}
}
if (F3[j] < bestP) //
F3[j] = bestP;
}
}
return F3[c];
}