动态规划——完全背包问题

问题

在这里插入图片描述

源码

/*
* problem: 完全背包
* method: 动态规划
* date: 2020/05/11
*/
#include<iostream>
#include<string.h>
using namespace std;
const int MAX_N=100;
const int MAX_W=10000;
int w[MAX_N]= {3,4,2};
int v[MAX_N]= {4,5,3};
int dp[MAX_N+1][MAX_W+1];
int x[MAX_N];
int N=3;
int W=7;
void solve() {
 int i,j;
 memset(dp,0,sizeof(int)*(N+1)*(W+1));
 for(i=1; i<=N; i++) {
  for(j=1; j<=W; j++) {
   if(w[i-1]>j) {
    dp[i][j]=dp[i-1][j];
   } else {
    dp[i][j]=max(dp[i-1][j],dp[i][j-w[i-1]]+v[i-1]);
   }
  }
 }
 for(i=N,j=W; i>0||j>0;) {
  if(dp[i][j]==dp[i-1][j])    i--;
  else {
   j-=w[i-1];
   x[i-1]++;
  }
 }
}
int main() {
 int i,j;
 solve();
 cout<<dp[N][W]<<"(";
 for(i=0; i<N; i++) {
  cout<<i+1<<"号物品选"<<x[i]<<"个,";
 }
 cout<<"\b)"<<endl;
 for(i=0;i<=N;i++){
  for(j=0;j<=W;j++){
   cout<<dp[i][j]<<" ";
  }
  cout<<endl;
 }
 return 0;
}

猜你喜欢

转载自blog.csdn.net/The_Only_God/article/details/106062502