程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1963 Investment 多重背包

HDU 1963 Investment 多重背包

編輯:C++入門知識

 


求每次能獲得的最大利潤,多重背包。

這裡要用到一個技巧,題目說了v[i]是1000的倍數,所以可以都除以1000

 


代碼如下:


 
 

#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <cmath>  
#include <cstring>  
#include <string>  
#include <vector>  
#include <list>  
#include <deque>  
#include <queue>  
#include <iterator>  
#include <stack>  
#include <map>  
#include <set>  
#include <algorithm>  
#include <cctype>  
using namespace std; 
 
typedef long long LL; 
const int N=51510; 
const LL II=1000000007; 
 
int dp[N],v[15],w[15]; 
int V,y,n; 
 
int main() 
{ 
    int n,i,j,k,l,t; 
    cin>>n; 
    while(n--) 
    { 
        scanf("%d%d%d",&V,&y,&t); 
        for(i=1;i<=t;i++) 
        { 
            scanf("%d%d",&v[i],&w[i]); 
            v[i]/=1000; 
        } 
        for(l=1;l<=y;l++) 
        { 
            int temp=V/1000; 
            memset(dp,0,sizeof(dp)); 
            for(i=1;i<=t;i++) 
            { 
                for(j=v[i];j<=temp;j++) 
                //多重背包  j=v[i];j<=temp;j++  
                //01背包    j=temp;j>=v[i];j--  
                    if(dp[j]<dp[j-v[i]]+w[i]) 
                        dp[j]=dp[j-v[i]]+w[i]; 
            } 
            V+=dp[temp]; 
        } 
        printf("%d\n",V); 
    } 
    return 0; 
} 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

typedef long long LL;
const int N=51510;
const LL II=1000000007;

int dp[N],v[15],w[15];
int V,y,n;

int main()
{
 int n,i,j,k,l,t;
 cin>>n;
 while(n--)
 {
        scanf("%d%d%d",&V,&y,&t);
        for(i=1;i<=t;i++)
        {
            scanf("%d%d",&v[i],&w[i]);
            v[i]/=1000;
        }
        for(l=1;l<=y;l++)
        {
            int temp=V/1000;
            memset(dp,0,sizeof(dp));
            for(i=1;i<=t;i++)
            {
                for(j=v[i];j<=temp;j++)
                //多重背包  j=v[i];j<=temp;j++
                //01背包    j=temp;j>=v[i];j--
                    if(dp[j]<dp[j-v[i]]+w[i])
                        dp[j]=dp[j-v[i]]+w[i];
            }
            V+=dp[temp];
        }
        printf("%d\n",V);
 }
 return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved