因为本身楼主对于编程这方面很菜,所以请多多包容,谢谢。
//下面是正文
这道题就是一个提高的01背包,将原来的一个条件转化成了两个条件,难点就在转化的地方
因为我们需要两个条件,自然就会多出来一个循环,那么之前的一维数组就需要开到二维,这是程序:
for(i=1;i<=n;i++) {
for(j=m;j>=0;j--) {
for(l=k;l>=0;l--) {
if(j>=a[i]&&l>=b[i]) f[j][l]=max(f[j][l],f[j-a[i]][l-b[i]]+c[i]);
}
}
}这里数组a表示第一个条件要占用的值,b表示第二个条件要占用的值,c表示价值
这是源程序:
#include <bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1001],f[1001][1001];
int main()
{
memset(f,0,sizeof(f));
int i,j,k,l,n,m;
cin>>m>>k;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
for(i=1;i<=n;i++) {
for(j=m;j>=0;j--) {
for(l=k;l>=0;l--) {
if(j>=a[i]&&l>=b[i]) f[j][l]=max(f[j][l],f[j-a[i]][l-b[i]]+c[i]);
}
}
}
cout<<f[m][k]<<endl;
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-36880.html