Vijos1334_NASA的食物计划

来源:互联网 发布:手机处理数据作图软件 编辑:程序博客网 时间:2024/04/24 22:01

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

//下面是正文

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


1 0