HDU 1963 Investment 多重背包

2014-11-24 00:04:29 · 作者: · 浏览: 4


求每次能获得的最大利润,多重背包。

这里要用到一个技巧,题目说了v[i]是1000的倍数,所以可以都除以1000


代码如下:



#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
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]
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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]