标签:c++
题目链接:
二维:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 505 using namespace std; int dp[505][100005]; int need[505]; int value[505]; int main() { int n,v; while(~scanf("%d%d",&n,&v)) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d%d",&need[i],&value[i]); for(int i=1;i<=n;i++) for(int j=1;j<=v;j++) { int maxvalue=dp[i-1][j]; for(int k=0;k*need[i]<=j;k++) { int thevalue=dp[i-1][j-need[i]*k]+value[i]*k; if(thevalue>maxvalue) maxvalue=thevalue; } dp[i][j]=maxvalue; } printf("%d\n",dp[n][v]); } return 0; }
一维:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 505 using namespace std; int dp[100005]; int need[505]; int value[505]; int main() { int n,v; while(~scanf("%d%d",&n,&v)) { int ans=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d%d",&need[i],&value[i]); for(int i=1;i<=n;i++) for(int j=0;j<=v;j++) for(int k=0;k*need[i]<=j;k++){ dp[j]=max(dp[j],dp[j-need[i]*k]+value[i]*k); if(dp[j]>ans) ans=dp[j]; } printf("%d\n",ans); } return 0; }
0-1一维:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 505 using namespace std; int dp[100005]; int need[505]; int value[505]; int main() { int n,v; while(~scanf("%d%d",&n,&v)) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d%d",&need[i],&value[i]); for(int i=1;i<=n;i++) for(int j=need[i];j<=v;j++) //取同一物品时从前往后推 dp[j]=max(dp[j],dp[j-need[i]]+value[i]); printf("%d\n",dp[v]); } return 0; }
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/46008159