1268:【例9.12】完全背包问题

1268:【例9.12】完全背包问题

    • 【题目描述】
    • 【输入】
    • 【输出】
    • 【输入样例】
    • 【输出样例】

【题目描述】

设有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;
}

你可能感兴趣的:(一本通,动态规划,c++)