dp --背包问题

Description

开学了,同学们都回到了学校,happy457还是改不了晚上吃零食的习惯,为了省点钱,于是在周末他就带上了一定数量的钱来到了沃尔玛超市来选购他想要的东西,超市在那个周末很奇怪,对于某些商品他只卖给同一个人1件,而某些商品他最多只卖给同一个人两件,在没有其它的卖法了,现在happy457给每个商品按照自己的喜好给他们都标记上了一个价值,他想在自己的钱有限的范围内购买的商品的价值最大,请你帮他计算一下他能得到的最大价值。

Input

有多组输入数据。首先输入m和n,表示他带有m元钱(1<=m<=1000),接着是n(1<=n<=500)行,每行有三个正整数a,b,c,(1<=a<=2,0<=b<=1000,1<=c<=100)分别表示该商品的出卖方式,购买该商品的钱数和happy457给它定的价值。

Output

输出happy457能得到的最大价值

Sample Input

5 2
1 2 3
1 3 2

Sample Output

5

http://acm.hrbeu.edu.cn/index.php?act=problem&id=1010&cid=60

#include <cstdio>
#include <stdlib.h>
#include <memory.h>
const int M=1005;
const int N=505;
int w[N],v[N],l[N],a[M];
int n,m;
int max(int x,int y)
{
    return(x>y?x:y);
}
void cal()
{
    memset(a,0,sizeof(a));
   for(int j=1;j<=n;j++)
   {
       for(int i=m;i>=v[j];i--)
       {
          if(v[j]==0) a[i]+=l[j]*w[j];// 注意v可能为0
          else
          {
           int tmp=0;
           for(int t=0;t<=l[j];t++)
           {
               if(i>=t*v[j]) tmp=a[i-t*v[j]]+t*w[j];
               a[i]=max(tmp,a[i]);
           }
          }

          /*int tmp=0;
           for(int t=0;t<=l[j];t++)
           {
               if(i>=t*v[j]) tmp=a[i-t*v[j]]+t*w[j];
               a[i]=max(tmp,a[i]);
           }
           */
       }
   }

}
int main()
{

    while(scanf("%d%d",&m,&n)!=EOF)
    {
     for(int i=1;i<=n;i++)
     {
         scanf("%d%d%d",&l[i],&v[i],&w[i]);
     }
     cal();
     printf("%d\n",a[m]);
    }
    return 0;
}

posted @ 2012-02-16 18:26  wuzhibin  阅读(238)  评论(0)    收藏  举报