#include <iostream> #include <algorithm> using namespace std; #define N 3//物品个数 #define V 10//背包容量 int dp[N+1][V+1]; int C[N+1]={0,10,5,5}; //Ci表示第i件物品的费用 (i从1开始) int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值 int ZeroOnePack(){ for(int i=1;i<=N;i++){ for(int v=C[i];v<=V;v++) dp[i][v]=max(dp[i-1][v],dp[i-1][v-C[i]]+W[i]); } return dp[N][V]; } int main() { memset(dp,0,sizeof(dp));//先对dp初始化 cout<<ZeroOnePack(); return 0; } |
#include <iostream> #include <algorithm> using namespace std; #define N 3//物品个数 #define V 10//背包容量 int C[N+1]={0,10,5,5}; //Ci表示第i件物品的费用 (i从1开始) int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值 int dp[V+1]; int ZeroOnePack(){ for(int i=1;i<=N;i++){ for(int v=V;v>=C[i];v--) dp[v]=max(dp[v],dp[v-C[i]]+W[i]); } return dp[V]; } int main() { memset(dp,0,sizeof(dp));//先对dp初始化 cout<<ZeroOnePack(); return 0; } |
#include <iostream>
#include <algorithm>
using namespace std;
#define N 3//物品个数
#define V 10//背包容量
int C[N+1]={0,10,5,5}; //Ci表示第i件物品的费用 (i从1开始)
int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值
int dp[V+1];
int sum[N+1]={0};//辅助数组,用于求C[N]+C[N-1]……
int ZeroOnePack(){
//常数优化
sum[N]=C[N];
for(int i=N-1;i>=1;i--)sum[i]+=sum[i+1]+C[i];
//end
for(int i=1;i<=N;i++){
for(int v=V;v>=max(V-sum[i],C[i]);v--)
dp[v]=max(dp[v],dp[v-C[i]]+W[i]);
}
return dp[V];
}
int main()
{
memset(dp,0,sizeof(dp));//先对dp初始化
cout<<ZeroOnePack();
return 0;
}
|
#include <iostream> #include <algorithm> using namespace std; #define N 3//物品个数 #define V 10//背包容量 int C[N+1]={0,10,5,5}; //Ci表示第i件物品的费用 (i从1开始) int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值 int ZeroOnePack(int i,int v){ if(i<=0||v<=0)return 0; //不选第i件物品 int a=ZeroOnePack(i-1,v); //必须得保证剩下的容量v能够有C[i]的容量,才能选择第i件物品 int b=v>=C[i]?ZeroOnePack(i-1,v-C[i])+W[i]:0; return max(a,b); } int main() { cout<<ZeroOnePack(N,V); return 0; } |
#include <iostream> #include <algorithm> #include <vector> using namespace std; #define INF -0x7ffffff #define N 3//物品个数 #define V 10//背包容量 int C[N+1]={0,10,4,5}; //Ci表示第i件物品的费用 (i从1开始) int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值 vector<int> dp; int ZeroOnePack(){ for(int i=1;i<=N;i++){ for(int v=V;v>=C[i];v--) dp[v]=max(dp[v],dp[v-C[i]]+W[i]); } return dp[V]; } int main() { dp.assign(V+1,INF);//dp初始化为负无穷 dp[0]=0; cout<<ZeroOnePack(); return 0; } |
#include <iostream> #include <algorithm> using namespace std; #define INF -0x7fffffff #define N 3//物品个数 #define V 10//背包容量 int C[N+1]={0,10,4,5}; //Ci表示第i件物品的费用 (i从1开始) int W[N+1]={0,2,2,1}; //W[i]表示第i件物品的价值 int ZeroOnePack(int i,int v){ if(v==0)return 0; if(i==0)return INF; //不选第i件物品 int a=ZeroOnePack(i-1,v); //必须得保证剩下的容量v能够有C[i]的容量,才能选择第i件物品 int b=v>=C[i]?ZeroOnePack(i-1,v-C[i])+W[i]:INF; return max(a,b); } int main() { cout<<ZeroOnePack(N,V); return 0; } |
原文:http://blog.csdn.net/starcuan/article/details/19487975