Vijos1334

    xiaoxiao2021-03-25  68

    因为本身楼主对于编程这方面很菜,所以请多多包容,谢谢。

    //下面是正文

    这道题就是一个提高的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

    最新回复(0)