给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装
入背包中物品的总价值最大?
入背包中物品的总价值最大?
物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n]={0,6,3,5,4,6}, 包的体积是10
输入
5 10
2 6
2 3
6 5
5 4
4 6
输出
15
#include<stdio.h> #include<string.h> #define MAXN 100 #define MAXV 1000 int max(int a,int b) { return a>b?a:b; } //n件物品和一个容量为v的背包。第i件物品的费用是c[i],价值是w[i] //算法1:经典DP二维数组解法,时间复杂度及空间复杂度均为O(nv) int ZeroOnePack1(int n,int v,int c[],int w[]) { int i,j; int f[MAXN][MAXV]; memset(f,0,sizeof(f)); for(i=1;i<=n;i++){ for(j=0;j<=v;j++){ if(j>=c[i]) f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]); else f[i][j]=f[i-1][j]; } } return f[n][v]; } int main(){ int i; int n,v,c[MAXN],w[MAXN]; freopen("1.txt","r",stdin); while(scanf("%d %d",&n,&v)!=EOF){ for(i=1;i<=n;i++) { scanf("%d %d",&c[i],&w[i]); } printf("%d\n",ZeroOnePack1(n,v,c,w)); } return 0; }
此算法精炼可靠
通俗易懂不错