hdu 2602 Bone Collector 坑爹01背包

来源:互联网 发布:苹果mac切换系统 编辑:程序博客网 时间:2024/06/05 11:44

基本的01背包:但有个地方特坑爹,骨头可以体积为0,价值不为零,用二维数组写,仅仅差了一个数字,交了几次都WA,一维和二维差别很小。

1,体积循环二维背包从零到n,一维从n到0。

2.二维中的dp[I][j]相当于一维的dp[j],d[I-1][j-w[I]]相当于d[j-w[I]]

二维:

#include<iostream>#include<string.h>using namespace std;const int N = 1000;int dp[N+1][N+1];int n,v;int c[N+1],w[N+1];void pack(){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)for(int j=0;j<=v;j++){if(j<w[i])dp[i][j] = dp[i-1][j];else{dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);}}cout<<dp[n][v]<<endl;}int main(){int t;cin>>t;while(t--){cin>>n>>v;for(int i=1;i<=n;i++)cin>>c[i];for(int i=1;i<=n;i++)cin>>w[i];pack();}}


一维:

#include<iostream>#include<string.h>using namespace std;const int N = 1000;int dp[N+1];int n,v;int c[N+1],w[N+1];void pack(){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)for(int j=v;j>=0;j--){if(j<w[i])dp[j] = dp[j];else{dp[j] = max(dp[j-w[i]]+c[i],dp[j]);}}cout<<dp[v]<<endl;}int main(){int t;cin>>t;while(t--){cin>>n>>v;for(int i=1;i<=n;i++)cin>>c[i];for(int i=1;i<=n;i++)cin>>w[i];pack();}}

0 0