【题目描述】
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
【输入】
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
第2…N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
max=12
*这是快乐的背包例题三连水之二
#include<cstdio>
using namespace std;
const int N=201;
int qread () {
int x=0,f=1;
char ch=getchar();
while (ch>'9'||ch<'0') {
if(ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=(x<<3)+(x<<1)+ch-48;
ch=getchar();
}
return x*f;
}
int i,j,m,n,wi,ci,f[N]={0};
int main () {
m=qread();n=qread();
for(i=1;i<=n;i++) {
wi=qread();ci=qread();
for(j=wi;j<=m;j++)//这里恰好要重复计算,改成顺序,又水一道题
if(f[j]<f[j-wi]+ci) f[j]=f[j-wi]+ci;
}
printf("max=%d",f[m]);
return 0;
}