揹包問題(第一次遇到)

揹包問題


初次接觸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 digui
		for(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(感激不盡這位仁兄)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章