算法设计与分析 3.4 小鲨鱼

★题目描述

本期活动中,共有N件商品参与促销,你身上带了M块钱。

这N种物品每种物品有价格Ci和原价Vi,以及限购Ki件。

你想知道你最多能够买走原价总和多少的商品。

★输入格式

第一行包括两个正整数N, M,表示共有N件商品,你有M块钱。

接下来的N行,每i行包括三个自然数Ci,Vi,Ki。表示第i件商品的价格、原价和限购数量。

★输出格式

输出仅包括一个正整数,表示你能买走的最大原价总和。

★样例输入

2 8
2 100 4
4 100 2

★样例输出

400

★提示

1<=N<=200,1<=M<=3000,
0<=Ci<=20,1<=Vi<=200,1<=Ki<=1000000

/*
多重背包问题
但是由于时间的限制,在遍历商品数量时要用二进制的思想 
*/ 
#include<bits/stdc++.h>
using namespace std;
int N,M;
int Ci,Vi,Ki;
int F[3001];

int main(){
	cin>>N>>M;
	
	memset(F, 0, sizeof(F));
	for(int i=0; i<N; ++i){
		scanf("%d%d%d",&Ci,&Vi,&Ki);
		for(int k=1; k<=Ki; Ki-=k, k=min(k*2, Ki)){  
			for(int v=M; v>=Ci; --v){
				if(v>=k*Ci) F[v] = max(F[v], F[v-k*Ci]+k*Vi);
			}
			if(k==Ki) break;
		}
	}
	
	cout<<F[M]<<endl;
	return 0;
} 
原文地址:https://www.cnblogs.com/yejifeng/p/12060571.html