逃亡的准备

题目描述

每个人小时候都有自己的理想,但随着时间推移,渐渐的大多数人的理想变成了金钱.地位.面子… 于是大多数人 就变成了传说中的俗人。但我们的中中始终有自己的梦想,他要 环 游 世 界! 在20XX年X月X日中中开始环游世 界的准备工作.他开始准备自己的行囊
中中背包的容积为m ,中中有n样有用的东西 ,每样东西都有自己的价值Wi,和体积Vi ,每一样物品有Ni个 (Ni=0时表示有无限多个),于是乎我们的问题就是(你应该已经猜到了)…中中能带走的 东西的最大价值。
30%数据满足 1 <= m,n <=1000
100%数据满足 1 <=m,n <= 10000
输入

第 1 行: N,M–物品的种类和背包的容积
第 2-N+1 行: Vi,Wi,Pi–三个整数:每个物品的体积.价值.个数
输出

单独的一行在给定的限制里可能得到的最大的价值。
样例输入

5 50
1 1 50
2 4 3
48 49 1
1 51 1
3 3 3
样例输出

106

这道题真的是坑了我半天,原先是TLE(因为没有把分组背包转化为0-1背包),到后来一个if语句写错了,造成了多次wa(一直在愣神ε=(´ο`*))),愣是没改出来)。以后不论怎样,切记不要慌,欲速则不达~

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,i,j;
int v[10005],w[10005],c[10005];
int dp[10005];
void ZeroOnePack(int volume,int weight)
{
	for(int i=m;i>=volume;i--)
	dp[i]=max(dp[i],dp[i-volume]+weight);
}
void CompletePack(int volume,int weight)
{
	for(int i=volume;i<=m;i++)
	dp[i]=max(dp[i],dp[i-volume]+weight);
}
void Multiple(int volume,int weight,int num)
{
	if(num*volume>=m)//
	{
		CompletePack(volume,weight);
		return ;
	}
	int k=1,sum=0;
	while(k<num)
	{
		ZeroOnePack(k*volume,k*weight);
		num-=k;
		k*=2;
	}
	ZeroOnePack(num*volume,num*weight);
	
}
int main()
{
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		//memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++)
		scanf("%d %d %d",&v[i],&w[i],&c[i]);
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++)
		{	
			//if(c[i]==0)
			//CompletePack(v[i],w[i]);
			//else
			Multiple(v[i],w[i],c[i]);
		}
		printf("%d\n",dp[m]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lemon1090/article/details/89408210