Description
设有 n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为 M,今从 n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于 M,而价值的和为最大。
Format
Input
第 11 行:两个整数,M(背包容量,M≤200)和 N(物品数量,N≤30); 第 2…N+1 行:每行二个整数 Wi,Ci,表示每个物品的重量和价值。
Output
仅一行,一个数,表示最大总价值。
Samples
输入数据 1
10 4
2 1
3 3
4 5
7 9
输出数据 1
12
Limitation
1s, 1024KiB for each test case.
题解:
详见0/1背包这题,需要改动的是不用考虑物品数量了,因此要多加一个控制放入物品数次的循环。
程序:
#include<bits/stdc++.h>
using namespace std;
int m,n,w[40],c[40],dp[40][210];//w[i]物品的重量,c[i]物品的价值,dp[j]当前物品放进去之后容量为j的背包的价值
int main() {
cin>>m>>n;
for(int i=1;i<=n;++i)
cin>>w[i]>>c[i];
for(int i=1;i<=n;i++)//遍历n个物品
for(int j=1;j<=m;j++)//j为当前背包容量 ,从后往前遍历背包
for(int k=0;k*w[i]<=j;k++)
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*c[i]);
cout<<dp[n][m];
return 0;
}