第一步:
利用一维数组推导出氧气
#include <bits/stdc++.h>
using namespace std;
int main(){
int m;//氧气需求量
int k;//气缸个数
int a[1001];//第i个气缸里的氧气容量
int c[1001]; //气缸重量
cin>>m;
cin>>k;
for(int i=1;i<=k;i++)
cin>>a[i]>>c[i];
int f[1001][22];
memset(f,801,sizeof(f));
//利用状态转移方程推导完成任务的最低重量
for(int i=1;i<=k;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]>=j)
{
f[i][j]=min(f[i-1][j],c[i]);
}
else
{
f[i][j]=min(f[i-1][j],c[i]+f[i-1][j-a[i]]);
}
}
}
cout<<f[k][m]<<endl;
return 0;
}
/*
5
5
3 120
10 129
5 250
1 130
4 119
*/
根据代码后的样例,得出129;
第二步:
数组再加一维导出氮气
导出非压缩数组:
#include <bits/stdc++.h>
using namespace std;
int main(){
int m;//氧气需求量
int n;//氮气需求量
int k;//气缸个数
int a[1001]={0};//第i个气缸里的氧气容量
int b[1001]={0}; //第i个气缸里的氮气容量
int c[1001]={0}; //气缸重量
cin>>m>>n;
cin>>k;
for(int i=1;i<=k;i++)
cin>>a[i]>>b[i]>>c[i];
int f[1001][22][80];
memset(f,801,sizeof(f));
//利用状态转移方程推导完成任务的最低重量
for(int i=1;i<=k;i++)
{
for(int j=1;j<=m;j++)
{
for(int l=1;l<=n;l++)
{
if(a[i]>=j&&b[i]>=l)
{
f[i][j][l]=min(f[i-1][j][l],c[i]);
}
else
{
int x=max(0,j-a[i]);
int y=max(0,l-b[i]);
f[i][j][l]=min(f[i-1][j][l],c[i]+f[i-1][x][y]);
}
}
}
}
cout<<f[k][m][n]<<endl;
return 0;
}
/*
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
*/
第三步:
最后进行数组压缩
废话不说,上代码:
以上为讲解,不是答案;
以下为答案;
#include <bits/stdc++.h>
using namespace std;
int main(){
int m;//氧气需求量
int n;//氮气需求量
int k;//气缸个数
int a[1001]={0};//第i个气缸里的氧气容量
int b[1001]={0}; //第i个气缸里的氮气容量
int c[1001]={0}; //气缸重量
cin>>m>>n;
cin>>k;
for(int i=1;i<=k;i++)
cin>>a[i]>>b[i]>>c[i];
int f[22][80];
memset(f,801,sizeof(f));
//利用状态转移方程推导完成任务的最低重量
for(int i=1;i<=k;i++)
{
for(int j=m;j>=1;j--)
{
for(int l=n;l>=1;l--)
{
if(a[i]>=j&&b[i]>=l)
{
f[j][l]=min(f[j][l],c[i]);
}
else
{
int x=max(0,j-a[i]);
int y=max(0,l-b[i]);
f[j][l]=min(f[j][l],c[i]+f[x][y]);
}
}
}
}
cout<<f[m][n]<<endl;
return 0;
}
/*
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
*/
根据样例得出答案为249;
点赞,关注,散会;