1013. 无限背包
Posted bernieloveslife
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1013. 无限背包相关的知识,希望对你有一定的参考价值。
Description
你现在有一个体积为V的大袋子,有N种物品,假设每种物品的数量有无限多个,而且第i种物品的体积是c[i],价值是w[i],请选择一些物品放入袋中,使袋中物品的价值总和最大。
注意每种物品的数量是无限多的;对于放入袋中的同种物品数量没有限制。
Input Format
第一行包含两个正整数V和N,分别代表袋子的体积和物品的种类数。
以下N行分别由2个正整数组成,代表每种物品的体积和价值。
V
。
保证操作可在C++ int范围内完成。
Output Format
输出一个整数,表示最大的价值总和
Sample Input
5 3
2 3
3 2
4 1
Sample Output
6
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct item{
int c;
int w;
double p;
}item;
bool com(item a,item b){
return a.p>b.p;
}
int main(){
int v,n;
item a[1001];
cin>>v>>n;
for(int i=0;i<n;i++){
cin>>a[i].c>>a[i].w;
a[i].p=a[i].w/double(a[i].c);
}
sort(a,a+n,com);
int sum=0,j,k;
for(int i=0;i<n;i++){
j=v/a[i].c;
k=v%a[i].c;
sum+=j*a[i].w;
v=k;
}
cout<<sum;
return 0;
}
以上是关于1013. 无限背包的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 1677 [Usaco2005 Jan]Sumsets 求和:dp 无限背包 / 递推2的幂次方之和