问题内容
escription
你现在有一个体积为V的大袋子,有N种物品,假设每种物品的数量有无限多个,而且第i种物品的体积是c[i],价值是w[i],请选择一些物品放入袋中,使袋中物品的价值总和最大。
注意每种物品的数量是无限多的;对于放入袋中的同种物品数量没有限制。
Input Format
第一行包含两个正整数V和N,分别代表袋子的体积和物品的种类数。
以下N行分别由2个正整数组成,代表每种物品的体积和价值。
V≤10000,N≤1000。
保证操作可在C++ int范围内完成。
Output Format
输出一个整数,表示最大的价值总和
Sample Input
5 3
2 3
3 2
4 1
Sample Output
6
代码实现
#include <stdio.h>
#define LEN 1000
int val[LEN];
int vol[LEN];
int main()
{
double minRatio = 0;
int v, n, i, idx, cnt, value;
while(scanf("%d %d",&v,&n)!=EOF){
for(i = 0,value = 0; i < n; i++){
scanf("%d %d", &vol[i], &val[i]);
}
while(1){
for(i = 0, minRatio = 0; i < n; i++){
if(vol[i] < v){
if(!minRatio){
minRatio = 1.0 * val[i] / vol[i];
idx = i;
}
else{
if(minRatio < 1.0 * val[i] / vol[i]){
minRatio = 1.0 * val[i] / vol[i];
idx = i;
}
}
}
}
if(!minRatio){
break;
}
cnt = v/vol[idx];
v -= cnt * vol[idx];
value += cnt*val[idx];
}
printf("%d\n",value);
}
return 0;
}
很久以前做杨辉三角的时候问学长:“这真的属于动态规划吗?”学长反问我:“你真的懂什么是动态规划吗?”