DP46. 装箱问题
描述
有一个箱子容量为 V ,同时有n个物品,每个物品有一个体积(正整数)。每个物品只能使用一次。输入描述
输出描述
输出箱子最小剩余空间示例1
输入:
24 6 8 3 12 7 9 7
输出:
0
C 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2022-05-18
#include<stdio.h> int main() { int v,n,s[30]; scanf("%d%d",&v,&n); for(int i=0;i<n;i++) { scanf("%d",&s[i]); } for(int i=0;i<n;i++) { for(int j=0;j<i;j++) { if(s[i]>s[j]) { int t=s[i]; s[i]=s[j]; s[j]=t; } } } for(int i=0;i<n;i++) { if(v>=s[i]) v-=s[i]; } printf("%d",v); }
C 解法, 执行用时: 3ms, 内存消耗: 360KB, 提交时间: 2022-05-13
#include<stdio.h> int main(){ int v,n,s[30]; scanf("%d%d",&v,&n); for(int i=0;i<n;i++) scanf("%d",&s[i]); for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(s[i]>s[j]){ int t=s[i]; s[i]=s[j]; s[j]=t; } for(int i=0;i<n;i++){ if(v>=s[i]) v-=s[i]; } printf("%d",v); }
C 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-06-23
#include <stdio.h> #include <string.h> int min(int x, int y) { return x<=y?x:y; } int main() { int V; scanf("%d",&V);//%d遇到回车换行或者空格当作结束符号,作为结束输入的标志 int n; scanf("%d",&n); int arr[n]; for(int i=0; i<n; i++) { scanf("%d",&arr[i]); } int dp[V+1];//dp[j]表示容量为j的时候,装入物品后剩余的最小空间 // int dp[V+1];//dp[j]表示容量为j的时候,装入物品的最大体积数量 for(int j=0; j<=V; j++) { dp[j] = j; } dp[0] = 0; for(int i=0; i<n; i++) { for(int j=V; j>=0; j--) { if(j >= arr[i]) { dp[j] =min(dp[j],(dp[j-arr[i]]));//dp[j-arr[i]]表示选择装入arr[i]后的箱子剩余最小空间 //j-arr[i]表示装入arr[i]之前的箱子体积,该体积的箱子最小剩余空间dp[j-arr[i]]其实就是容量为j的箱子,装入arr[i]物品后的剩余最小体积相同 } } } printf("%d",dp[V]); return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-26
#include<stdio.h> int max(int a,int b){ if(a>=b) return a; else return b; } int main(){ int v,n; scanf("%d",&v); scanf("%d",&n); int a[v+1],w; for(int i=0;i<=v;i++){ a[i]=0; } for(int i=0;i<n;i++){ scanf("%d",&w); for(int j=v;j>=w;j--){ a[j]=max(a[j],a[j-w]+w); } } printf("%d",v-a[v]); return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-03-14
#include<iostream> #include<vector> #include<limits.h> using namespace std; int main() { int V,n; cin>>V; cin>>n; vector<int> v(n), dp(V+1,0); for(int i=0;i<n;i++) cin>>v[i]; // for(int j=0;j<=V;j++) dp[j] = j; for(int i=0;i<n;i++) { for(int j=V;j>=v[i];j--) { dp[j] = max(dp[j], dp[j-v[i]]+v[i]); } } cout<<V-dp[V]; return 0; }