这道题本质上还是一个完全背包的问题
需要注意的点还是:
1.要求装满首先是讲一维初始化问题 至于是正无穷还是负无穷要根据问题而定。
2.min OR max?
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxlen=1e3 + 10; const int INF = 0x3f3f3f; int weight[maxlen]; int value[maxlen]; int dp[maxlen]; int main(){ int i,j,k,n; while(~scanf("%d",&n)){ for(i=1;i<=n;i++){ scanf("%d",&value[i]); weight[i]=i; } memset(dp,INF,sizeof(dp)); dp[0]=0; for(i=1;i<=n;i++) for(j=weight[i];j<=n;j++) dp[j]=min(dp[j],dp[j-weight[i]]+value[i]); printf("%d ",dp[n]); } return 0; }