这一到题目的状态转移方程式不难找到,关键是如何初始化的问题,让我恼火的狠,纠结啊
二维数组代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n,m,l;
int c[105],v[105];
int dp[105][1005];
void zeroOnePack(int cost1,int cost2,int value)
{
for(int i=m;i>=cost1;i--)
{
for(int j=l;j>=cost2;j--)
{
dp[i][j]=max(dp[i][j],dp[i-cost1][j-cost2]+value);
}
}
}
int main()
{
int ncase;
cin>>ncase;
while(ncase--)
{
cin>>n>>m>>l;
for(int i=1;i<=n;i++)
cin>>c[i]>>v[i];
for(int i=0;i<=m;i++)
{
for(int j=0;j<=l;j++)
{
dp[i][j]=-1<<30;
}
}
for(int i=0;i<=l;i++) //这个地方一定要是二维费用中的那个最大的上限
dp[0][i]=0;
for(int i=1;i<=n;i++)
{
//dp[i][0]=0;如果这个地方的n大于等于l,那么上面的初始化就可以不要了,
zeroOnePack(1,c[i],v[i]);
}
if(dp[m][l] < 0) dp[m][l] = 0;
cout<<dp[m][l]<<endl;
}
}
三维数组如下:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int MAX =1005;
int dp[101][101][1001];
int l,m,n;
int c[MAX],v[MAX];
void zhf()
{
for(int i=1;i<=n;i++)
{
int cost1 = c[i]; //时间消耗
int cost2=1; //票数消耗
int value = v[i];
for(int j=m;j>=1;j--) //票数
{
for(int k=l;k>=0;k--) //时间
{
dp[i][j][k] = dp[i-1][j][k];
if(k>=cost1)
dp[i][j][k] = max( dp[i-1][j][k], dp[i-1][j-1][k-cost1]+value);
// cout<<dp[i][j][k]<<endl;
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int ncase;
cin>>ncase;
while(ncase--)
{
cin>>n>>m>>l;
for(int i=1;i<=n;i++)
{
cin>>c[i]>>v[i];
}
for(int i=0;i<101;i++)
for(int j=0;j<101;j++)
for(int k=0;k<1001;k++)
dp[i][j][k]=-0xfffffff;
dp[0][0][0]=0;
/*for(int i=0;i<=m;i++)
for(int j=0;j<=l;j++)
dp[0][i][j]=0;*/
for(int i=0;i<=n;i++)
for(int j=0;j<=l;j++)
dp[i][0][j]=0;
//for(int i=0;i<=n;i++)
// for(int j=0;j<=m;j++)
// dp[i][j][0]=0;
zhf();
if(dp[n][m][l]<0)
dp[n][m][l]=0;
cout<<dp[n][m][l]<<endl;
}
return 0;
}