HDU 2602 01背包中两种写法
来源:互联网 发布:程序员去哪个招聘网站 编辑:程序博客网 时间:2024/06/07 01:07
做背包题目:要注意一点就是各个数组的初始化!01背包中初始化要分两种情况:1:恰好装满,就是const int inf=0x3f3f3f3f; f[0]=0; for(i=1; i<maxn; i++){ f[i]=inf;}2:如果没有要求恰好装满!!!那就可以这样赋值!for(i=0; i<maxn; i++){ f[i]=0;}//一维数组写的!#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 1005__int64 value[maxn],cost[maxn];__int64 f[maxn];__int64 n,v;__int64 zeroback(__int64 val, __int64 cos){ for(__int64 i=v; i>=cos; i--) { f[i]=max(f[i],f[i-cos]+val); }}int main(){ __int64 t,i; scanf("%I64d",&t); while(t--) { memset(value,0,sizeof(value)); memset(cost,0,sizeof(cost)); memset(f,0,sizeof(f)); scanf("%I64d%I64d",&n,&v); for(i=1; i<=n; i++) { scanf("%I64d",&value[i]); } for(i=1; i<=n; i++) { scanf("%I64d",&cost[i]); } for(i=1; i<=n; i++) { zeroback(value[i],cost[i]); } printf("%I64d\n",f[v]); } return 0;}二维写的:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=1005;int value[maxn],cost[maxn];int f[maxn][maxn];int main(){ int t,n,v; int i,j; scanf("%d",&t); while(t--) { memset(value,0,sizeof(value)); memset(cost,0,sizeof(cost)); memset(f,0,sizeof(f)); scanf("%d%d",&n,&v); for(i=1; i<=n; i++) { scanf("%d",&value[i]); } for(i=1; i<=n; i++) { scanf("%d",&cost[i]); } for(i=1; i<=n; i++) { for(j=v; j>=0; j--) { if(j>=cost[i])//这里是判断该物品是否放的下!!! { f[i][j]=max(f[i-1][j],f[i-1][j-cost[i]]+value[i]); } else { f[i][j]=f[i-1][j]; } } } printf("%d\n",f[n][v]); } return 0;}