背包问题(第一次遇到)

来源:互联网 发布:犀牛门户源码 编辑:程序博客网 时间:2024/06/06 03:46

背包问题


初次接触DP,背包问题,百度百科了下,NP完全问题,这也是个值得研究的问题,;

学习来源:

http://shmilyaw-hotmail-com.iteye.com/blog/2009761

在这里就不复制这位兄台的原文了,写写我自己的,

这是他贴出来的递推公式,                     


图片掉不过头。。将就了,做个笔记。

//分割线 20160920

http://acm.hdu.edu.cn/showproblem.php?pid=2602

代码

#include<stdio.h>#include <memory.h>int max(int a,int b){return a>b?a:b;}int main(){int i,k,cnt,T,t,N,V;int arrVal[1024],arrV[1024],dp[1024];scanf("%d",&T);while(T-->0){memset(arrVal,0,sizeof(arrVal));memset(arrV,0,sizeof(arrV));memset(dp,0,sizeof(dp));scanf("%d %d",&N,&V);for(t=1;t<=N;t++)scanf("%d",&arrVal[t]);for(t=1;t<=N;t++)scanf("%d",&arrV[t]);//fei diguifor(i=1;i<=N;i++)//前 i 个;1 - N{for(k=V;k>=arrV[i];k--)//在总容量为 V 的情况下;V-0{//dp[]=max(不取这一个,取这一个)dp[k]=max(dp[k],dp[k-arrV[i]]+arrVal[i]);}}printf("%d\n",dp[V]);}return 0;}

标准的 01背包,用1维数组做的


//2维数组

#include<iostream>using namespace std;int dp[1000][1000];int max(int x,int y){    return x>y?x:y;}int main(){    int t,n,v,i,j;    int va[1000],vo[1000];    cin>>t;    while(t--)    {        cin>>n>>v;        for(i=1;i<=n;i++)            cin>>va[i];        for(i=1;i<=n;i++)            cin>>vo[i];        memset(dp,0,sizeof(dp));//初始化操作         for(i=1;i<=n;i++)        {            for(j=0;j<=v;j++)            {                if(vo[i]<=j)//表示第i个物品将放入大小为j的背包中                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-vo[i]]+va[i]);//第i个物品放入后,那么前i-1个物品可能会放入也可能因为剩余空间不够无法放入                else //第i个物品无法放入                    dp[i][j]=dp[i-1][j];            }        }        cout<<dp[n][v]<<endl;    }    return 0;}
原文:http://www.cnblogs.com/Su-Blog/archive/2012/08/28/2659872.html(感激不尽这位仁兄)

1 0
原创粉丝点击