简单的动态规划——装箱问题

来源:互联网 发布:淘宝标题关键词重复 编辑:程序博客网 时间:2024/06/05 07:44

装箱问题

告诉你箱子的容积为多少,告诉你有N件物品和每一件物品的体积,问如何选择物品才能令箱子的剩余容积最小。
搜索递归

#include<bits/stdc++.h>using namespace std;int p;int v[40];int n;int dp(int i,int j){ int ans=j;  if(i==0) {ans=j;return ans;}  else if(ans<v[i])    ans=dp(i-1,ans);  else      ans=min(dp(i-1,ans),dp(i-1,ans-v[i]));return ans;}int main(){  scanf("%d",&p);  scanf("%d",&n);  for(int i=1;i<=n;i++)    scanf("%d",&v[i]);  cout<<dp(n,p)<<endl;}

记忆化搜索

#include<bits/stdc++.h>using namespace std;int p;int v[40];int n;int dp[35][20004];int rec(int i,int j){  if(dp[i][j]>=0)    return dp[i][j];  int ans=j;  if(i==0) {return j;}  else if(ans<v[i])    ans=rec(i-1,ans);  else      ans=min(rec(i-1,ans),rec(i-1,ans-v[i]));return dp[i][j]=ans;}int main(){  scanf("%d",&p);  scanf("%d",&n);  for(int i=1;i<=n;i++)    scanf("%d",&v[i]);  memset(dp,-1,sizeof(dp));  cout<<rec(n,p)<<endl;}

动态规划

#include<bits/stdc++.h>using namespace std;int p;int v[40];int n;int dp[20003]={0};int rec( ){for(int i=1;i<=n;i++)  for(int j=p;j>=v[i];j--)    dp[j]=max(dp[j],dp[j-v[i]]+v[i]);return p-dp[p];}int main(){  scanf("%d",&p);  scanf("%d",&n);  for(int i=1;i<=n;i++)    scanf("%d",&v[i]);  cout<<rec()<<endl;}