hdu 2602 Bone Collector

来源:互联网 发布:淘宝店铺无法订购花呗 编辑:程序博客网 时间:2024/06/15 04:58

        我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。 
如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。 
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。

一维数组:

#include<iostream>#include<string.h>using namespace std;struct Node{    int m;    int v;}d[1005];int f[1005];int main(){    int t,i,j;    cin>>t;    while(t--)    {        memset(f,0,sizeof(f));        int num,sum;        cin>>num>>sum;        for(i=1;i<=num;i++)        cin>>d[i].m;        for(j=1;j<=num;j++)        cin>>d[j].v;        for(i=1;i<=num;i++)        {            for(j=sum;j>=d[i].v;j--)            {                int a=f[j];                int b=f[j-d[i].v]+d[i].m;               f[j]=a>b?a:b;            }        }        cout<<f[sum]<<endl;    }    return 0;}
二维数组
#include<iostream>#include<string.h>using namespace std;int val[1005];int vol[1005];int dp[1005][1005];int main(){    int t;    cin>>t;    memset(dp,0,sizeof(dp));    while(t--)    {        int n,v,i,j;        cin>>n>>v;        for(i=1;i<=n;i++)        cin>>val[i];        for(i=1;i<=n;i++)        cin>>vol[i];        /*for(i=1;i<=n;i++)        for(j=0;j<=v;j++)        {            if(j>=vol[i]&&dp[i-1][j]<dp[i-1][j-vol[i]]+val[i])            dp[i][j]=dp[i-1][j-vol[i]]+val[i];            else            dp[i][j]=dp[i-1][j];        }        cout<<dp[n][v]<<endl;*/        for(i=0;i<=v;i++)            for(j=1;j<=n;j++)            {                 if(vol[j]<=i && dp[i][j-1]<dp[i-vol[j]][j-1]+val[j])                    dp[i][j]=dp[i-vol[j]][j-1]+val[j];                else                    dp[i][j]=dp[i][j-1];            }                           cout<<dp[v][n]<<endl;    }    return 0;}


原创粉丝点击