(精)hdoj 2191(多重背包)(注意两点,第一更新result,第二n还是m)

来源:互联网 发布:印度GDP计算方法 知乎 编辑:程序博客网 时间:2024/06/05 18:32
这个是原始的错误版本#include<iostream>#include<stdio.h>using namespace std;#define MAX 120class Point{public:int price;int height;int cnum;};Point point[MAX];int casen;int n;int m;int result[MAX];int max(int a,int b){if(a>b)return a;return b;}int main(){//freopen("in.txt","r",stdin);scanf("%d",&casen);while(casen--){//输入部分scanf("%d%d",&n,&m);int i=0;for(i=0;i<n;i++){scanf("%d%d%d",&point[i].price,&point[i].height,&point[i].cnum);}//处理部分int limit=n;result[n]=0;int j;for(i=0;i<m;i++)//选择买第i种大米{for(j=0;j<point[i].cnum;j++)//选择买j袋{if(limit-j*point[i].price>=0){result[limit-j*point[i].price]=max(result[limit-j*point[i].price],result[limit]+j*point[i].height);}}}//求出最大值int max=0;for(i=0;i<MAX;i++){if(max<result[i]){max=result[i];}}cout<<max<<endl;}return 0;}主要是在处理的时候,应该考虑到大米应该是一下子就买了好几袋,这样会突变,中间的很多状态都没有进行比较。应该一袋一袋的购买,让后边买边比较,不会漏掉任何情况。下面的是正确的版本#include<iostream>#include<stdio.h>using namespace std;#define MAX 101class Point{public:int price;int height;int cnum;};Point point[MAX];int casen;int n;int m;int result[MAX];int main(){//freopen("in.txt","r",stdin);scanf("%d",&casen);while(casen--){//输入部分scanf("%d %d",&n,&m);int i=0;for(i=0;i<m;i++){scanf("%d %d %d",&point[i].price,&point[i].height,&point[i].cnum);}//初始化for(i=0;i<MAX;i++){result[i]=0;}//处理部分int limit=n;int j;int k=0;for(i=0;i<m;i++)//选择买第i种大米{for(j=0;j<point[i].cnum;j++)//选择买j袋{//如果说买k袋大米比买k+1袋大米优for(k=limit;k>=point[i].price;k--){if(result[k] < result[k-point[i].price]+point[i].height){result[k]=result[k-point[i].price]+point[i].height;}}}}printf("%d\n",result[limit]);}return 0;}

原创粉丝点击