题设
题目描述
n种商品,背包容量为k,每种商品最多取一次,每种商品体积为w,价值为v,求装入最大价值
输入
第一行输入两个正整数,分别为 n 和 k
之后 n 行,每行两个正整数 v 和 w,分别是商品价值和体积
输出
装入最大价值
输入样例
3 6
1 1
1 3
2 4
输出样例
3
样例解释
拿体积为 1 和体积为 4 的商品
数据范围
1≤n≤103
1≤k,w≤105
1≤v≤107
二维数组版
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 0x7fffffff
#define MIN -2147483648
int N,K,k,v[1010],w[1010],i,j;
long long int P[1010][100010],state[1010][100010];
int p1,p2;
int main() {
int N,i,j;
scanf("%d %d",&N,&K);
for(i=1; i<=N; i++) {
scanf("%d %d",&v[i],&w[i]);
}
for(i=0; i<=N; i++) {
state[i][0]=P[i][0]=0;
}
for(i=0; i<=K; i++) {
state[0][i]=P[0][i]=0;
}
for(i=0; i<=N; i++) {
for(j=0; j<=K; j++) {
if(j<w[i]){
P[i][j]=P[i-1][j];
continue;
}else{
p1=P[i-1][j-w[i]]+v[i];
p2=P[i-1][j];
if(p1<p2) {
P[i][j]=p2;
state[i][j]=0;
} else if(p1>p2) {
P[i][j]=p1;
state[i][j]=1;
}
}
}
}
printf("%lld\n",P[N][K]);
// k=K;
// for(i=N;i>=1;i--){
// if(P[i][K]==1){
// sum+=v[i];
// k=k-w[i];
// }
// }
// putchar('\n');
// for(i=0;i<=N;i++){
// for(j=0;j<=K;j++){
// printf("%d ",state[i][j]);
// }
// putchar('\n');
// }
// putchar('\n');
// for(i=0;i<=N;i++){
// for(j=0;j<=K;j++){
// printf("%d ",P[i][j]);
// }
// putchar('\n');
// }
return 0;
}
一维数组优化版
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 0x7fffffff
#define MIN -2147483648
int N,K,v[1010],w[1010],i,j;
long long int P[100010],p1,p2;
int main() {
int N,i,j;
scanf("%d %d",&N,&K);
for(i=1; i<=N; i++) {
scanf("%d %d",&v[i],&w[i]);
}
for(i=0; i<=K; i++) {
P[i]=0;
}
for(i=1;i<=N;i++){
for(j=K;j>0;j--){
if(j<w[i]){
// printf("%d ",P[j]);
continue;
}else{
p1=P[j];
p2=P[j-w[i]]+v[i];
if(p1>=p2){
P[j]=p1;
}else{
P[j]=p2;
}
// printf("%d ",P[j]);
}
}
// putchar('\n');
}
printf("%lld\n",P[K]);
return 0;
}